{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a href=\"https://colab.research.google.com/github/timeseriesAI/tsai/blob/master/tutorial_nbs/00c_Time_Series_data_preparation.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "created by Ignacio Oguiza - email: oguiza@timeseriesAI.co"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Import libraries 📚"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Since some of you have been asking questions as to how to prepare your data to be able to use timeserisAI, I've prepared a short tutorial to address this.\n",
    "\n",
    "There are endless options in terms of how your source data may be stored, so I'll cover a few of the most frequent ones I've seen. I may be expanding this in the future if needed."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# # **************** UNCOMMENT AND RUN THIS CELL IF YOU NEED TO INSTALL/ UPGRADE TSAI ****************\n",
    "# stable = True # Set to True for latest pip version or False for main branch in GitHub\n",
    "# !pip install {\"tsai -U\" if stable else \"git+https://github.com/timeseriesAI/tsai.git\"} >> /dev/null"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "os             : Darwin-19.6.0-x86_64-i386-64bit\n",
      "python         : 3.6.13\n",
      "tsai           : 0.2.23\n",
      "fastai         : 2.5.3\n",
      "fastcore       : 1.3.27\n",
      "torch          : 1.9.1\n",
      "n_cpus         : 8\n",
      "device         : cpu\n"
     ]
    }
   ],
   "source": [
    "from tsai.all import *\n",
    "computer_setup()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Required input shape 🔶"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To be able to use timeseriesAI your data needs to have 3 dimensions: \n",
    "\n",
    "* **number of samples**\n",
    "* **number of features** (aka variables, dimensions, channels)\n",
    "* **number of steps** (or length, time steps, sequence steps)\n",
    "\n",
    "There are a few convenience functions that you may want to use to prepare your data. \n",
    "\n",
    "We are going to see how you could prepare your data in a few scenarios. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Note: I've recently modified timeseriesAI so that you can also use 2d input data in the case of univariate time series (they'll be converted to 3d internally), although you can still pass univariate time series as 3d or pass them if you prefer. You'll get the same result.**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## UCR time series data ⏳"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The easiest case if if you want to use some of the data already preprocessed in timeseriesAI (all UCR datasets have been included). In this case, the only thing you need to do is:\n",
    "\n",
    "* select a univariate or multivariate dataset from the list\n",
    "* use the get_UCR_data function"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "univariate datasets:  ['ACSF1', 'Adiac', 'AllGestureWiimoteX', 'AllGestureWiimoteY', 'AllGestureWiimoteZ', 'ArrowHead', 'Beef', 'BeetleFly', 'BirdChicken', 'BME', 'Car', 'CBF', 'Chinatown', 'ChlorineConcentration', 'CinCECGTorso', 'Coffee', 'Computers', 'CricketX', 'CricketY', 'CricketZ', 'Crop', 'DiatomSizeReduction', 'DistalPhalanxOutlineAgeGroup', 'DistalPhalanxOutlineCorrect', 'DistalPhalanxTW', 'DodgerLoopDay', 'DodgerLoopGame', 'DodgerLoopWeekend', 'Earthquakes', 'ECG200', 'ECG5000', 'ECGFiveDays', 'ElectricDevices', 'EOGHorizontalSignal', 'EOGVerticalSignal', 'EthanolLevel', 'FaceAll', 'FaceFour', 'FacesUCR', 'FiftyWords', 'Fish', 'FordA', 'FordB', 'FreezerRegularTrain', 'FreezerSmallTrain', 'Fungi', 'GestureMidAirD1', 'GestureMidAirD2', 'GestureMidAirD3', 'GesturePebbleZ1', 'GesturePebbleZ2', 'GunPoint', 'GunPointAgeSpan', 'GunPointMaleVersusFemale', 'GunPointOldVersusYoung', 'Ham', 'HandOutlines', 'Haptics', 'Herring', 'HouseTwenty', 'InlineSkate', 'InsectEPGRegularTrain', 'InsectEPGSmallTrain', 'InsectWingbeatSound', 'ItalyPowerDemand', 'LargeKitchenAppliances', 'Lightning2', 'Lightning7', 'Mallat', 'Meat', 'MedicalImages', 'MelbournePedestrian', 'MiddlePhalanxOutlineAgeGroup', 'MiddlePhalanxOutlineCorrect', 'MiddlePhalanxTW', 'MixedShapesRegularTrain', 'MixedShapesSmallTrain', 'MoteStrain', 'NonInvasiveFetalECGThorax1', 'NonInvasiveFetalECGThorax2', 'OliveOil', 'OSULeaf', 'PhalangesOutlinesCorrect', 'Phoneme', 'PickupGestureWiimoteZ', 'PigAirwayPressure', 'PigArtPressure', 'PigCVP', 'PLAID', 'Plane', 'PowerCons', 'ProximalPhalanxOutlineAgeGroup', 'ProximalPhalanxOutlineCorrect', 'ProximalPhalanxTW', 'RefrigerationDevices', 'Rock', 'ScreenType', 'SemgHandGenderCh2', 'SemgHandMovementCh2', 'SemgHandSubjectCh2', 'ShakeGestureWiimoteZ', 'ShapeletSim', 'ShapesAll', 'SmallKitchenAppliances', 'SmoothSubspace', 'SonyAIBORobotSurface1', 'SonyAIBORobotSurface2', 'StarLightCurves', 'Strawberry', 'SwedishLeaf', 'Symbols', 'SyntheticControl', 'ToeSegmentation1', 'ToeSegmentation2', 'Trace', 'TwoLeadECG', 'TwoPatterns', 'UMD', 'UWaveGestureLibraryAll', 'UWaveGestureLibraryX', 'UWaveGestureLibraryY', 'UWaveGestureLibraryZ', 'Wafer', 'Wine', 'WordSynonyms', 'Worms', 'WormsTwoClass', 'Yoga']\n"
     ]
    }
   ],
   "source": [
    "print('univariate datasets: ', get_UCR_univariate_list())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "multivariate datasets:  ['ArticularyWordRecognition', 'AtrialFibrillation', 'BasicMotions', 'CharacterTrajectories', 'Cricket', 'DuckDuckGeese', 'EigenWorms', 'Epilepsy', 'ERing', 'EthanolConcentration', 'FaceDetection', 'FingerMovements', 'HandMovementDirection', 'Handwriting', 'Heartbeat', 'InsectWingbeat', 'JapaneseVowels', 'Libras', 'LSST', 'MotorImagery', 'NATOPS', 'PEMS-SF', 'PenDigits', 'PhonemeSpectra', 'RacketSports', 'SelfRegulationSCP1', 'SelfRegulationSCP2', 'SpokenArabicDigits', 'StandWalkJump', 'UWaveGestureLibrary']\n"
     ]
    }
   ],
   "source": [
    "print('multivariate datasets: ', get_UCR_multivariate_list())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((360, 24, 51),\n",
       " (360,),\n",
       " ((#180) [0,1,2,3,4,5,6,7,8,9...],\n",
       "  (#180) [180,181,182,183,184,185,186,187,188,189...]))"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ds_name = 'NATOPS' \n",
    "X, y, splits = get_UCR_data(ds_name, return_split=False)\n",
    "X.shape, y.shape, splits"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(#360) [(TSTensor(vars:24, len:51, device=cpu), TensorCategory(3)), (TSTensor(vars:24, len:51, device=cpu), TensorCategory(2)), (TSTensor(vars:24, len:51, device=cpu), TensorCategory(2)), (TSTensor(vars:24, len:51, device=cpu), TensorCategory(3)), (TSTensor(vars:24, len:51, device=cpu), TensorCategory(2)), (TSTensor(vars:24, len:51, device=cpu), TensorCategory(4)), (TSTensor(vars:24, len:51, device=cpu), TensorCategory(0)), (TSTensor(vars:24, len:51, device=cpu), TensorCategory(5)), (TSTensor(vars:24, len:51, device=cpu), TensorCategory(2)), (TSTensor(vars:24, len:51, device=cpu), TensorCategory(1))] ...]"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tfms  = [None, [Categorize()]]\n",
    "dsets = TSDatasets(X, y, tfms=tfms, splits=splits, inplace=True)\n",
    "dsets"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As you can see, X has 3 dimensions: \n",
    "\n",
    "* 360 samples\n",
    "* 24 features\n",
    "* 51 time steps\n",
    "\n",
    "Let's visualize of the samples:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(X[0].T);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2d or 3d np.ndarray/ torch.Tensor ⌗"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Another option is that you have your data as an array or a tensor. \n",
    "In this case, the only thing you'll need to do is to transform your data to 3d (if not already done), and generate your splits.\n",
    "We are going to simulate this scenario generating 2d data for a univariate dataset: "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((60, 570), (60,))"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ds_name = 'OliveOil' \n",
    "X, y, _ = get_UCR_data(ds_name, return_split=False)\n",
    "X_2d = X[:, 0]\n",
    "X_2d.shape, y.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To make data 3d you use `to3d`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(60, 1, 570)"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_3d = to3d(X_2d)\n",
    "X_3d.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To generate your splits, you would use `get_splits`. Here you need to indicate: \n",
    "* valid_size=0.2\n",
    "* test_size (optional)\n",
    "* stratify=True if you want stratified splits\n",
    "* random_state=seed or None (random)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABAYAAABKCAYAAAAoj1bdAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAQD0lEQVR4nO3df3BV9ZnH8c8nCfKjKBqJIESXFloMpgQaC7VLEanLWovtWotawf7YUneczm63divd3Y5apLPdnR3Xdu3OtP4ozNiyOqKuOu6qWxH8MUttqKkoINShA0pMaEgRKZJLnv3jnmyzaRKSmxMuN+f9mmG455zv+X6fk/twD/fJOd/jiBAAAAAAAMimsmIHAAAAAAAAiofCAAAAAAAAGUZhAAAAAACADKMwAAAAAABAhlEYAAAAAAAgwygMAAAAAACQYRQGAAAly/bTtpcnr5fafmIQfU2xHbYrkuX/tP25lOL8iO3tXZZ32b4ojb6T/l62vSCt/gAAQLZQGAAAFJXtebaft/1b2622n7P9wYH2ExE/johFXfoN29MKjSsiPhYRa47Vrj/jRMQzETG90Fi6jbfa9qpu/Z8bEU+n0T8AAMieimIHAADILtunSHpU0nWS7pN0kqSPSHqnmHGlyXZFROSKHQcAAEBvuGIAAFBM75OkiFgbEUcj4ncR8URE/FKSbH8+uYLg9uSKgm22P9pTR0nbZ5PXG5PVjbYP2r6yh/bltv/Z9j7br0n6eLftXW9TmGZ7QxLDPtv39jaO7QW299heYbtJ0o8613UL4YO2X7G93/aPbI/qfhxdYokkhmslLZV0QzLeI8n2/7s1wfZI27fZfiP5c5vtkcm2zti+ZrvZ9l7bXzjmuwQAAIY1CgMAgGJ6VdJR22tsf8z2aT20mSvpV5LGS7pJ0gO2K/vqNCLmJy/rImJsRNzbQ7MvSVosabak8yR9uo8ub5H0hKTTJFVL+tdjjDNRUqWkP5J0bS99LpX0p5KmKl8g+WZfx5SM90NJP5b0T8l4l/bQ7O8lfUjSLEl1kuZ063uipHGSJkv6oqTv9/JzBwAAGUFhAABQNBFxQNI8SSHpDkktth+2PaFLs2ZJt0VEe/LFe7u6/Xa/QFck/e6OiFZJ/9BH23blv+RPiojDEfFsH20lqUPSTRHxTkT8rpc2t3cZ+9uSPjPQA+jFUkkrI6I5IlokfUvSNV22tyfb2yPiMUkHJaUy/wEAAChNFAYAAEUVEVsj4vMRUS2pVtIkSbd1afJ6RESX5V8nbQZrkqTd3frtzQ2SLOlnyRMA/vwYfbdExOFjtOk+dhrHpKSfrsfSve/fdJvz4JCksSmNDQAAShCFAQDACSMitklarXyBoNNk2+6yfLakN1IYbq+ks7r121tcTRHxpYiYJOkvJP3bMZ5EEH1s69R97M5jelvSmM4NticOsO83lL+6oae+AQAA/gCFAQBA0dg+J5kIrzpZPkv5S+r/p0uzMyT9le0RtpdIqpH0WD+6f1PSe/rYfl/Sb3Vyj/03+ohzSWeMkvYr/+W8o5/j9ObLydiVys8L0Dk/QaOkc23PSiYkvLnbfscab62kb9qusj1e0o2S7ikgPgAAkBEUBgAAxfSW8pMLbrL9tvIFgS2SvtalzSZJ75W0T/l78T8dEb/pR983S1pju832FT1sv0PS48p/Ed8s6YE++vpgEuNBSQ9L+kpEvNbPcXrzE+UnNHxN+ckVV0lSRLwqaaWk/5a0Q1L3+QzukjQjGe+hHvpdJennkn4p6aXk2FYNIC4AAJAx/v+3bQIAcOKw/XlJyyNiXrFjAQAAGK64YgAAAAAAgAyjMAAAAAAAQIZxKwEAAAAAABnGFQMAAAAAAGQYhQEAAAAAADKsYig6tceHNGUouh4SY2q2Frzvoa01KUaCtJXae1useLM2bpZk7WdcasdbavFmUaHvEZ+NOJGQU/3Dz2kgGvZFRFWxo0B6hmSOAfu8yD9CuTR8oKG+4H031zekGAnSVmrvbbHizdq4WZK1n3GpHW+pxZtFhb5HfDbiREJO9Q8/p4FwQ0ScV+wokB5uJQAAAAAAIMMoDAAAAAAAkGEUBgAAAAAAyLAhmXwQAAAAAIATWUNDwxkVFRV3SqrV8P6leYekLblcbnl9fX1zTw0oDAAAAAAAMqeiouLOiRMn1lRVVe0vKytLf1b+E0RHR4dbWlpmNDU13SnpEz21Gc5VEQAAAAAAelNbVVV1YDgXBSSprKwsqqqqfqv8lRE9tzmO8QAAAAAAcKIoG+5FgU7Jcfb6/Z9bCQAAAAAAOM6amprKFyxYMF2S9u3bN6KsrCwqKytzkvTiiy9uHTVqVK9Fi40bN465++67T1+9evXuNGI5ZmHA9t2SFktqjoheLz0AAAAAAKBU2apPs78INfS1feLEiUe3bdv2iiRdf/31k8aOHXt05cqVb3Zub29v14gRI3rcd/78+Yfmz59/KK1Y+3MrwWpJF6c1IAAAAAAA+EOXX375lKuvvvrsmTNnnnPddddVr1+/fsysWbPOqampmTF79uxzGhsbR0rSo48+evKFF144TcoXFZYsWTJlzpw506urq9+/atWqMwY67jGvGIiIjbanDPiIAAAAAADAgOzdu/ekzZs3b6uoqFBra2vZCy+8sG3EiBF66KGHTr7hhhuqH3/88V9132fnzp2jnn/++e1tbW3lNTU1tV//+tdbRo4c2e/5E1KbY8D2tZKuzS+dnVa3AAAAAABkxqc+9an9FRX5r+qtra3lV1555bt37do1yna0t7e7p30WLVrUNnr06Bg9enSusrKyfc+ePRVTp05t7++YqT2VICJ+GBHnRcR5UlVa3QIAAAAAkBljx47t6Hy9YsWKyRdccMFbO3bsePmRRx7ZeeTIkR6/w3e9OqC8vFy5XK7HAkJveFwhAAAAAAAnoAMHDpRXV1cfkaQf/OAH44dqHAoDAAAAAACcgFasWNF08803V9fU1MzI5XJDNk5/Hle4VtICSeNt75F0U0TcNWQRAQAAAABwnB3r8YJD6dZbb32jp/UXXXTR27t27drSufy9733vDUlavHjxW4sXL36rp3137Njx8kDH789TCT4z0E4BAAAAAEBp4FYCAAAAAAAyjMIAAAAAAAAZRmEAAAAAAIAMozAAAAAAAECGURgAAAAAACDDKAwAAAAAAHCczZ07933r1q07peu6lStXnrF06dKze2o/Z86c6Rs3bhwjSRdccMG0ffv2lXdvc/3110+68cYbJww0lmM+rhAAAAAAgOGufnN9fZr9NXygoaGv7UuWLGldu3Zt5eWXX36gc926desqv/Od7+w5Vt8bNmzYmUaMnbhiAAAAAACA4+yaa67Z/9RTT407fPiwJWn79u0nNTc3j7jnnnsqa2tra6ZNm3buV7/61Uk97Tt58uT37927t0KSVqxYMXHKlCm19fX103fs2DGykFiG6IqBhoOStw9N3+nbPKi6kNMKA70bL2lfITuW2ntbrHizNq4GkVOlptT+DQxWqeVU1t6fUlT4ezToz8YCP6fIC/whcqp/+EwekOnFDmA4mDBhwtG6urq377///nHLli1rW7NmTeWll166/5Zbbtk7YcKE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\n",
      "text/plain": [
       "<Figure size 1152x36 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "((#48) [58,21,9,45,41,54,56,46,44,53...],\n",
       " (#12) [55,38,40,18,16,24,3,28,50,14...])"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "splits = get_splits(y, valid_size=.2, stratify=True, random_state=23, shuffle=True)\n",
    "splits"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((60, 1, 570),\n",
       " (60,),\n",
       " ((#48) [58,21,9,45,41,54,56,46,44,53...],\n",
       "  (#12) [55,38,40,18,16,24,3,28,50,14...]))"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_3d.shape, y.shape, splits"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(#60) [(TSTensor(vars:1, len:570, device=cpu), TensorCategory(3)), (TSTensor(vars:1, len:570, device=cpu), TensorCategory(3)), (TSTensor(vars:1, len:570, device=cpu), TensorCategory(1)), (TSTensor(vars:1, len:570, device=cpu), TensorCategory(2)), (TSTensor(vars:1, len:570, device=cpu), TensorCategory(1)), (TSTensor(vars:1, len:570, device=cpu), TensorCategory(3)), (TSTensor(vars:1, len:570, device=cpu), TensorCategory(3)), (TSTensor(vars:1, len:570, device=cpu), TensorCategory(2)), (TSTensor(vars:1, len:570, device=cpu), TensorCategory(2)), (TSTensor(vars:1, len:570, device=cpu), TensorCategory(3))] ...]"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tfms  = [None, [Categorize()]]\n",
    "dsets = TSDatasets(X_3d, y, tfms=tfms, splits=splits, inplace=True)\n",
    "dsets"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In fastai I've modified TS datasets so that you can pass univariate time series as a 2d or 3d arrays."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(#60) [(TSTensor(len:570, device=cpu), TensorCategory(3)), (TSTensor(len:570, device=cpu), TensorCategory(3)), (TSTensor(len:570, device=cpu), TensorCategory(1)), (TSTensor(len:570, device=cpu), TensorCategory(2)), (TSTensor(len:570, device=cpu), TensorCategory(1)), (TSTensor(len:570, device=cpu), TensorCategory(3)), (TSTensor(len:570, device=cpu), TensorCategory(3)), (TSTensor(len:570, device=cpu), TensorCategory(2)), (TSTensor(len:570, device=cpu), TensorCategory(2)), (TSTensor(len:570, device=cpu), TensorCategory(3))] ...]"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tfms  = [None, [Categorize()]]\n",
    "dsets = TSDatasets(X_2d, y, tfms=tfms, splits=splits, inplace=True)\n",
    "dsets"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Pre-split 2d or 3d np.ndarray/ torch.Tensor"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If your data is already split into Train and Valid/ Test, you may the use `get_predefined_split` to generate the splits:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "ds_name = 'OliveOil' \n",
    "X_train, y_train, X_valid, y_valid = get_UCR_data(ds_name, return_split=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "X, y, splits = combine_split_data([X_train, X_valid], [y_train, y_valid])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(#60) [(TSTensor(vars:1, len:570, device=cpu), TensorCategory(0)), (TSTensor(vars:1, len:570, device=cpu), TensorCategory(0)), (TSTensor(vars:1, len:570, device=cpu), TensorCategory(0)), (TSTensor(vars:1, len:570, device=cpu), TensorCategory(0)), (TSTensor(vars:1, len:570, device=cpu), TensorCategory(0)), (TSTensor(vars:1, len:570, device=cpu), TensorCategory(1)), (TSTensor(vars:1, len:570, device=cpu), TensorCategory(1)), (TSTensor(vars:1, len:570, device=cpu), TensorCategory(1)), (TSTensor(vars:1, len:570, device=cpu), TensorCategory(1)), (TSTensor(vars:1, len:570, device=cpu), TensorCategory(1))] ...]"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tfms  = [None, [Categorize()]]\n",
    "dsets = TSDatasets(X, y, tfms=tfms, splits=splits, inplace=True)\n",
    "dsets"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Pandas dataframe with samples as rows 🐼"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Univariate"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>7</th>\n",
       "      <th>8</th>\n",
       "      <th>9</th>\n",
       "      <th>...</th>\n",
       "      <th>561</th>\n",
       "      <th>562</th>\n",
       "      <th>563</th>\n",
       "      <th>564</th>\n",
       "      <th>565</th>\n",
       "      <th>566</th>\n",
       "      <th>567</th>\n",
       "      <th>568</th>\n",
       "      <th>569</th>\n",
       "      <th>target</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-0.6113753</td>\n",
       "      <td>-0.61058575</td>\n",
       "      <td>-0.60655695</td>\n",
       "      <td>-0.6011323</td>\n",
       "      <td>-0.5943146</td>\n",
       "      <td>-0.5857617</td>\n",
       "      <td>-0.57741904</td>\n",
       "      <td>-0.57017505</td>\n",
       "      <td>-0.56328535</td>\n",
       "      <td>-0.5574073</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.9803849</td>\n",
       "      <td>-0.98032784</td>\n",
       "      <td>-0.9802198</td>\n",
       "      <td>-0.9806911</td>\n",
       "      <td>-0.98133653</td>\n",
       "      <td>-0.9823362</td>\n",
       "      <td>-0.9832128</td>\n",
       "      <td>-0.98367214</td>\n",
       "      <td>-0.9831198</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.61539173</td>\n",
       "      <td>-0.61372936</td>\n",
       "      <td>-0.6092278</td>\n",
       "      <td>-0.6043151</td>\n",
       "      <td>-0.5987679</td>\n",
       "      <td>-0.59050655</td>\n",
       "      <td>-0.5816167</td>\n",
       "      <td>-0.5729264</td>\n",
       "      <td>-0.5653742</td>\n",
       "      <td>-0.5599074</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.97933495</td>\n",
       "      <td>-0.97952265</td>\n",
       "      <td>-0.98003805</td>\n",
       "      <td>-0.9811463</td>\n",
       "      <td>-0.982332</td>\n",
       "      <td>-0.9825703</td>\n",
       "      <td>-0.9826299</td>\n",
       "      <td>-0.9828504</td>\n",
       "      <td>-0.9825495</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-0.61199886</td>\n",
       "      <td>-0.6105003</td>\n",
       "      <td>-0.606374</td>\n",
       "      <td>-0.6004454</td>\n",
       "      <td>-0.5930837</td>\n",
       "      <td>-0.5852453</td>\n",
       "      <td>-0.577118</td>\n",
       "      <td>-0.56882674</td>\n",
       "      <td>-0.56159616</td>\n",
       "      <td>-0.55609345</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.9796634</td>\n",
       "      <td>-0.9799643</td>\n",
       "      <td>-0.9805631</td>\n",
       "      <td>-0.9813258</td>\n",
       "      <td>-0.9827439</td>\n",
       "      <td>-0.9831074</td>\n",
       "      <td>-0.9830329</td>\n",
       "      <td>-0.98395646</td>\n",
       "      <td>-0.98385817</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-0.62278444</td>\n",
       "      <td>-0.6222215</td>\n",
       "      <td>-0.6190489</td>\n",
       "      <td>-0.6132514</td>\n",
       "      <td>-0.6058886</td>\n",
       "      <td>-0.59750843</td>\n",
       "      <td>-0.589047</td>\n",
       "      <td>-0.58069694</td>\n",
       "      <td>-0.57282245</td>\n",
       "      <td>-0.566727</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.96990246</td>\n",
       "      <td>-0.97058576</td>\n",
       "      <td>-0.9707182</td>\n",
       "      <td>-0.97119683</td>\n",
       "      <td>-0.9722684</td>\n",
       "      <td>-0.9726537</td>\n",
       "      <td>-0.9728614</td>\n",
       "      <td>-0.97367114</td>\n",
       "      <td>-0.9736139</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-0.62179345</td>\n",
       "      <td>-0.62127197</td>\n",
       "      <td>-0.61729795</td>\n",
       "      <td>-0.61207414</td>\n",
       "      <td>-0.6054717</td>\n",
       "      <td>-0.5976075</td>\n",
       "      <td>-0.5891649</td>\n",
       "      <td>-0.5814236</td>\n",
       "      <td>-0.57462037</td>\n",
       "      <td>-0.5684105</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.9778305</td>\n",
       "      <td>-0.978376</td>\n",
       "      <td>-0.9787776</td>\n",
       "      <td>-0.97965574</td>\n",
       "      <td>-0.98114824</td>\n",
       "      <td>-0.9817956</td>\n",
       "      <td>-0.98133105</td>\n",
       "      <td>-0.9812891</td>\n",
       "      <td>-0.98133105</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 571 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "             0            1            2            3           4  \\\n",
       "0   -0.6113753  -0.61058575  -0.60655695   -0.6011323  -0.5943146   \n",
       "1  -0.61539173  -0.61372936   -0.6092278   -0.6043151  -0.5987679   \n",
       "2  -0.61199886   -0.6105003    -0.606374   -0.6004454  -0.5930837   \n",
       "3  -0.62278444   -0.6222215   -0.6190489   -0.6132514  -0.6058886   \n",
       "4  -0.62179345  -0.62127197  -0.61729795  -0.61207414  -0.6054717   \n",
       "\n",
       "             5            6            7            8            9  ...  \\\n",
       "0   -0.5857617  -0.57741904  -0.57017505  -0.56328535   -0.5574073  ...   \n",
       "1  -0.59050655   -0.5816167   -0.5729264   -0.5653742   -0.5599074  ...   \n",
       "2   -0.5852453    -0.577118  -0.56882674  -0.56159616  -0.55609345  ...   \n",
       "3  -0.59750843    -0.589047  -0.58069694  -0.57282245    -0.566727  ...   \n",
       "4   -0.5976075   -0.5891649   -0.5814236  -0.57462037   -0.5684105  ...   \n",
       "\n",
       "           561          562          563          564          565  \\\n",
       "0   -0.9803849  -0.98032784   -0.9802198   -0.9806911  -0.98133653   \n",
       "1  -0.97933495  -0.97952265  -0.98003805   -0.9811463    -0.982332   \n",
       "2   -0.9796634   -0.9799643   -0.9805631   -0.9813258   -0.9827439   \n",
       "3  -0.96990246  -0.97058576   -0.9707182  -0.97119683   -0.9722684   \n",
       "4   -0.9778305    -0.978376   -0.9787776  -0.97965574  -0.98114824   \n",
       "\n",
       "          566          567          568          569 target  \n",
       "0  -0.9823362   -0.9832128  -0.98367214   -0.9831198      1  \n",
       "1  -0.9825703   -0.9826299   -0.9828504   -0.9825495      1  \n",
       "2  -0.9831074   -0.9830329  -0.98395646  -0.98385817      1  \n",
       "3  -0.9726537   -0.9728614  -0.97367114   -0.9736139      1  \n",
       "4  -0.9817956  -0.98133105   -0.9812891  -0.98133105      1  \n",
       "\n",
       "[5 rows x 571 columns]"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ds_name = 'OliveOil'\n",
    "X, y, _ = get_UCR_data(ds_name, return_split=False)\n",
    "X = X[:, 0]\n",
    "y = y.reshape(-1, 1)\n",
    "data = np.concatenate((X, y), axis=-1)\n",
    "df = pd.DataFrame(data)\n",
    "df = df.rename(columns={570: 'target'})\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "X, y = df2xy(df, target_col='target')\n",
    "test_eq(X.shape, (60, 1, 570))\n",
    "test_eq(y.shape, (60, ))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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feLEiUe3bdv2iiRdf/31k8aOHXt05cqVb3Zub29v14gRI3rcd/78+Yfmz59/KK1Y+3MrwWpJF6c1IAAAAAAA+EOXX375lKuvvvrsmTNnnnPddddVr1+/fsysWbPOqampmTF79uxzGhsbR0rSo48+evKFF144TcoXFZYsWTJlzpw506urq9+/atWqMwY67jGvGIiIjbanDPiIAAAAAADAgOzdu/ekzZs3b6uoqFBra2vZCy+8sG3EiBF66KGHTr7hhhuqH3/88V9132fnzp2jnn/++e1tbW3lNTU1tV//+tdbRo4c2e/5E1KbY8D2tZKuzS+dnVa3AAAAAABkxqc+9an9FRX5r+qtra3lV1555bt37do1yna0t7e7p30WLVrUNnr06Bg9enSusrKyfc+ePRVTp05t7++YqT2VICJ+GBHnRcR5UlVa3QIAAAAAkBljx47t6Hy9YsWKyRdccMFbO3bsePmRRx7ZeeTIkR6/w3e9OqC8vFy5XK7HAkJveFwhAAAAAAAnoAMHDpRXV1cfkaQf/OAH44dqHAoDAAAAAACcgFasWNF08803V9fU1MzI5XJDNk5/Hle4VtICSeNt75F0U0TcNWQRAQAAAABwnB3r8YJD6dZbb32jp/UXXXTR27t27drSufy9733vDUlavHjxW4sXL36rp3137Njx8kDH789TCT4z0E4BAAAAAEBp4FYCAAAAAAAyjMIAAAAAAAAZRmEAAAAAAIAMozAAAAAAAECGURgAAAAAACDDKAwAAAAAAHCczZ07933r1q07peu6lStXnrF06dKze2o/Z86c6Rs3bhwjSRdccMG0ffv2lXdvc/3110+68cYbJww0lmM+rhAAAAAAgOGufnN9fZr9NXygoaGv7UuWLGldu3Zt5eWXX36gc926desqv/Od7+w5Vt8bNmzYmUaMnbhiAAAAAACA4+yaa67Z/9RTT407fPiwJWn79u0nNTc3j7jnnnsqa2tra6ZNm3buV7/61Uk97Tt58uT37927t0KSVqxYMXHKlCm19fX103fs2DGykFiG6IqBhoOStw9N3+nbPKi6kNMKA70bL2lfITuW2ntbrHizNq4GkVOlptT+DQxWqeVU1t6fUlT4ezToz8YCP6fIC/whcqp/+EwekOnFDmA4mDBhwtG6urq377///nHLli1rW7NmTeWll166/5Zbbtk7YcKEo7lcTh/+8Ienb9q0afTcuXN/11MfzzzzzJgHH3yw8qWXXnqlvb1ds2bNmjF79uxDA41lqG4l2B4R5w1R38gY2z8nn5AmcgppI6eQNnIKaSOnkCbbPy92DMPFFVdc0XrvvfeetmzZsrYHHnig8o477ti1Zs2aytWrV4/P5XJuaWkZ0djYOKq3wsD69evHXnLJJW0nn3xyhyQtWrSorZA4uJUAAAAAAIAiuPrqq9uee+65U5599tkxhw8fLquqqsrdfvvtEzZs2PDqq6+++srChQt/e/jw4SH/3k5hAAAAAACAIhg3blzH+eef/9by5cunXHbZZa379+8vHz16dEdlZeXR3bt3Vzz99NPj+tp/4cKFBx977LFTDx486P3795c9+eSTpxYSx1DdSvDDIeoX2UQ+IW3kFNJGTiFt5BTSRk4hTeRTiq666qrWz372s1PXrl372uzZsw/X1tYemjp1au2ZZ555pL6+/mBf+86bN+/QZZdd1lpbW3vu6aef3j5z5sy3C4nBEVFY9AAAAAAAlKjGxsZddXV1mZiQWpIaGxvH19XVTelpG7cSAAAAAACQYakWBmxfbHu77Z22v5Fm38gG23fbbra9pcu6SttP2t6R/H1aMWNEabF9lu31tl+x/bLtryTrySsMmO1Rtn9muzHJp28l699te1Ny/rvX9knFjhWlxXa57V/YfjRZJqdQMNu7bL9k+8XO2eM572EwbJ9q+37b22xvtX0+OTW8pFYYsF0u6fuSPiZphqTP2J6RVv/IjNWSLu627huSfhoR75X002QZ6K+cpK9FxAxJH5L05eSzibxCId6RtDAi6iTNknSx7Q9J+kdJ/xIR0yTtl/TF4oWIEvUVSVu7LJNTGKwLI2JWl0cUct7DYHxX0n9FxDmS6pT/vCKnhpE0rxiYI2lnRLwWEUck/bukT6bYPzIgIjZKau22+pOS1iSv10j6s+MZE0pbROyNiM3J67eUP5FNFnmFAkRe5yRAI5I/IWmhpPuT9eQTBsR2taSPS7ozWbbIKaSP8x4KYnucpPmS7pKkiDgSEW0aHjnV0dHR4WIHcTwkx9nR2/Y0CwOTJe3usrwnWQcM1oSI2Ju8bpI0oZjBoHTZniJptqRNIq9QoOSS7xclNUt6UtKvJLVFRC5pwvkPA3WbpBv0+/+wnS5yCoMTkp6w3WD72mQd5z0U6t2SWiT9KLnl6U7b79LwyKktLS0t44Z7caCjo8MtLS3jJG3prc1QPa4QGBIREbZ5lAYGzPZYSesk/XVEHMj/Qi6PvMJARMRRSbNsnyrpQUnnFDcilDLbiyU1R0SD7QVFDgfDx7yIeN32GZKetL2t60bOexigCkkfkPSXEbHJ9nfV7baBUs2pXC63vKmp6c6mpqZaDe+J+Tskbcnlcst7a5BmYeB1SWd1Wa5O1gGD9abtMyNir+0zlf8tHdBvtkcoXxT4cUQ8kKwmrzAoEdFme72k8yWdarsi+Q0v5z8MxB9L+oTtSySNknSK8vfyklMoWES8nvzdbPtB5W/55byHQu2RtCciNiXL9ytfGCj5nKqvr2+W9Ilix3EiSLMq8oKk9yaz6J4k6SpJD6fYP7LrYUmfS15/TtJ/FDEWlJjkXt27JG2NiFu7bCKvMGC2q5IrBWR7tKQ/UX7eivWSPp00I5/QbxHxtxFRHRFTlP+/01MRsVTkFApk+122T+58LWmR8pcPc95DQSKiSdJu29OTVR+V9IrIqWHFEeld8ZFUu2+TVC7p7oj4dmqdIxNsr5W0QNJ4SW9KuknSQ5Luk3S2pF9LuiIiuk9QCPTI9jxJz0h6Sb+/f/fvlJ9ngLzCgNieqfwES+XKF9fvi4iVtt+j/KS7lZJ+IWlZRLxTvEhRipJbCf4mIhaTUyhUkjsPJosVkn4SEd+2fbo476FAtmcpP0HqSZJek/QFJedBkVPDQqqFAQAAAAAAUFqG8wQLAAAAAADgGCgMAAAAAACQYRQGAAAAAADIMAoDAAAAAABkGIUBAAAAAAAyjMIAAAAAAAAZRmEAAAAAAIAMozAAAAAAAECG/S9DcG03j0Pr/wAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 1152x36 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "((#48) [58,21,9,45,41,54,56,46,44,53...],\n",
       " (#12) [55,38,40,18,16,24,3,28,50,14...])"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "splits = get_splits(y, valid_size=.2, stratify=True, random_state=23, shuffle=True)\n",
    "splits"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(#60) [(TSTensor(vars:1, len:570, device=cpu), TensorCategory(3)), (TSTensor(vars:1, len:570, device=cpu), TensorCategory(3)), (TSTensor(vars:1, len:570, device=cpu), TensorCategory(1)), (TSTensor(vars:1, len:570, device=cpu), TensorCategory(2)), (TSTensor(vars:1, len:570, device=cpu), TensorCategory(1)), (TSTensor(vars:1, len:570, device=cpu), TensorCategory(3)), (TSTensor(vars:1, len:570, device=cpu), TensorCategory(3)), (TSTensor(vars:1, len:570, device=cpu), TensorCategory(2)), (TSTensor(vars:1, len:570, device=cpu), TensorCategory(2)), (TSTensor(vars:1, len:570, device=cpu), TensorCategory(3))] ...]"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tfms  = [None, [Categorize()]]\n",
    "dsets = TSDatasets(X, y, tfms=tfms, splits=splits, inplace=True)\n",
    "dsets"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Multivariate"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>feature</th>\n",
       "      <th>index</th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>7</th>\n",
       "      <th>...</th>\n",
       "      <th>561</th>\n",
       "      <th>562</th>\n",
       "      <th>563</th>\n",
       "      <th>564</th>\n",
       "      <th>565</th>\n",
       "      <th>566</th>\n",
       "      <th>567</th>\n",
       "      <th>568</th>\n",
       "      <th>569</th>\n",
       "      <th>target</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.611375</td>\n",
       "      <td>-0.610586</td>\n",
       "      <td>-0.606557</td>\n",
       "      <td>-0.601132</td>\n",
       "      <td>-0.594315</td>\n",
       "      <td>-0.585762</td>\n",
       "      <td>-0.577419</td>\n",
       "      <td>-0.570175</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.980385</td>\n",
       "      <td>-0.980328</td>\n",
       "      <td>-0.980220</td>\n",
       "      <td>-0.980691</td>\n",
       "      <td>-0.981337</td>\n",
       "      <td>-0.982336</td>\n",
       "      <td>-0.983213</td>\n",
       "      <td>-0.983672</td>\n",
       "      <td>-0.983120</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>-0.615392</td>\n",
       "      <td>-0.613729</td>\n",
       "      <td>-0.609228</td>\n",
       "      <td>-0.604315</td>\n",
       "      <td>-0.598768</td>\n",
       "      <td>-0.590507</td>\n",
       "      <td>-0.581617</td>\n",
       "      <td>-0.572926</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.979335</td>\n",
       "      <td>-0.979523</td>\n",
       "      <td>-0.980038</td>\n",
       "      <td>-0.981146</td>\n",
       "      <td>-0.982332</td>\n",
       "      <td>-0.982570</td>\n",
       "      <td>-0.982630</td>\n",
       "      <td>-0.982850</td>\n",
       "      <td>-0.982549</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>-0.611999</td>\n",
       "      <td>-0.610500</td>\n",
       "      <td>-0.606374</td>\n",
       "      <td>-0.600445</td>\n",
       "      <td>-0.593084</td>\n",
       "      <td>-0.585245</td>\n",
       "      <td>-0.577118</td>\n",
       "      <td>-0.568827</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.979663</td>\n",
       "      <td>-0.979964</td>\n",
       "      <td>-0.980563</td>\n",
       "      <td>-0.981326</td>\n",
       "      <td>-0.982744</td>\n",
       "      <td>-0.983107</td>\n",
       "      <td>-0.983033</td>\n",
       "      <td>-0.983956</td>\n",
       "      <td>-0.983858</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>-0.622784</td>\n",
       "      <td>-0.622221</td>\n",
       "      <td>-0.619049</td>\n",
       "      <td>-0.613251</td>\n",
       "      <td>-0.605889</td>\n",
       "      <td>-0.597508</td>\n",
       "      <td>-0.589047</td>\n",
       "      <td>-0.580697</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.969902</td>\n",
       "      <td>-0.970586</td>\n",
       "      <td>-0.970718</td>\n",
       "      <td>-0.971197</td>\n",
       "      <td>-0.972268</td>\n",
       "      <td>-0.972654</td>\n",
       "      <td>-0.972861</td>\n",
       "      <td>-0.973671</td>\n",
       "      <td>-0.973614</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "      <td>-0.621793</td>\n",
       "      <td>-0.621272</td>\n",
       "      <td>-0.617298</td>\n",
       "      <td>-0.612074</td>\n",
       "      <td>-0.605472</td>\n",
       "      <td>-0.597607</td>\n",
       "      <td>-0.589165</td>\n",
       "      <td>-0.581424</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.977831</td>\n",
       "      <td>-0.978376</td>\n",
       "      <td>-0.978778</td>\n",
       "      <td>-0.979656</td>\n",
       "      <td>-0.981148</td>\n",
       "      <td>-0.981796</td>\n",
       "      <td>-0.981331</td>\n",
       "      <td>-0.981289</td>\n",
       "      <td>-0.981331</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>175</th>\n",
       "      <td>3</td>\n",
       "      <td>55</td>\n",
       "      <td>99.377066</td>\n",
       "      <td>99.378307</td>\n",
       "      <td>99.383004</td>\n",
       "      <td>99.389189</td>\n",
       "      <td>99.396304</td>\n",
       "      <td>99.405102</td>\n",
       "      <td>99.414323</td>\n",
       "      <td>99.422454</td>\n",
       "      <td>...</td>\n",
       "      <td>99.033363</td>\n",
       "      <td>99.032615</td>\n",
       "      <td>99.032609</td>\n",
       "      <td>99.032021</td>\n",
       "      <td>99.031171</td>\n",
       "      <td>99.031198</td>\n",
       "      <td>99.030609</td>\n",
       "      <td>99.030441</td>\n",
       "      <td>99.030480</td>\n",
       "      <td>104.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>176</th>\n",
       "      <td>3</td>\n",
       "      <td>56</td>\n",
       "      <td>99.390295</td>\n",
       "      <td>99.392517</td>\n",
       "      <td>99.397438</td>\n",
       "      <td>99.402816</td>\n",
       "      <td>99.409873</td>\n",
       "      <td>99.418803</td>\n",
       "      <td>99.427823</td>\n",
       "      <td>99.436244</td>\n",
       "      <td>...</td>\n",
       "      <td>99.023249</td>\n",
       "      <td>99.022934</td>\n",
       "      <td>99.022428</td>\n",
       "      <td>99.021527</td>\n",
       "      <td>99.020822</td>\n",
       "      <td>99.020762</td>\n",
       "      <td>99.020462</td>\n",
       "      <td>99.019507</td>\n",
       "      <td>99.019367</td>\n",
       "      <td>104.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>177</th>\n",
       "      <td>3</td>\n",
       "      <td>57</td>\n",
       "      <td>99.387922</td>\n",
       "      <td>99.390261</td>\n",
       "      <td>99.394830</td>\n",
       "      <td>99.400812</td>\n",
       "      <td>99.407458</td>\n",
       "      <td>99.416016</td>\n",
       "      <td>99.425299</td>\n",
       "      <td>99.433606</td>\n",
       "      <td>...</td>\n",
       "      <td>99.026371</td>\n",
       "      <td>99.026007</td>\n",
       "      <td>99.025971</td>\n",
       "      <td>99.025246</td>\n",
       "      <td>99.024581</td>\n",
       "      <td>99.024234</td>\n",
       "      <td>99.023587</td>\n",
       "      <td>99.023002</td>\n",
       "      <td>99.023483</td>\n",
       "      <td>104.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>178</th>\n",
       "      <td>3</td>\n",
       "      <td>58</td>\n",
       "      <td>99.390348</td>\n",
       "      <td>99.391047</td>\n",
       "      <td>99.394922</td>\n",
       "      <td>99.401168</td>\n",
       "      <td>99.408396</td>\n",
       "      <td>99.416801</td>\n",
       "      <td>99.425483</td>\n",
       "      <td>99.433159</td>\n",
       "      <td>...</td>\n",
       "      <td>99.024331</td>\n",
       "      <td>99.023934</td>\n",
       "      <td>99.023716</td>\n",
       "      <td>99.022909</td>\n",
       "      <td>99.021966</td>\n",
       "      <td>99.021285</td>\n",
       "      <td>99.021127</td>\n",
       "      <td>99.020634</td>\n",
       "      <td>99.020106</td>\n",
       "      <td>104.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>179</th>\n",
       "      <td>3</td>\n",
       "      <td>59</td>\n",
       "      <td>99.377725</td>\n",
       "      <td>99.378153</td>\n",
       "      <td>99.381078</td>\n",
       "      <td>99.385643</td>\n",
       "      <td>99.392011</td>\n",
       "      <td>99.400396</td>\n",
       "      <td>99.408790</td>\n",
       "      <td>99.416355</td>\n",
       "      <td>...</td>\n",
       "      <td>99.030874</td>\n",
       "      <td>99.030576</td>\n",
       "      <td>99.030334</td>\n",
       "      <td>99.029671</td>\n",
       "      <td>99.028706</td>\n",
       "      <td>99.028079</td>\n",
       "      <td>99.027955</td>\n",
       "      <td>99.026948</td>\n",
       "      <td>99.026330</td>\n",
       "      <td>104.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>180 rows × 573 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     feature  index          0          1          2          3          4  \\\n",
       "0          1      0  -0.611375  -0.610586  -0.606557  -0.601132  -0.594315   \n",
       "1          1      1  -0.615392  -0.613729  -0.609228  -0.604315  -0.598768   \n",
       "2          1      2  -0.611999  -0.610500  -0.606374  -0.600445  -0.593084   \n",
       "3          1      3  -0.622784  -0.622221  -0.619049  -0.613251  -0.605889   \n",
       "4          1      4  -0.621793  -0.621272  -0.617298  -0.612074  -0.605472   \n",
       "..       ...    ...        ...        ...        ...        ...        ...   \n",
       "175        3     55  99.377066  99.378307  99.383004  99.389189  99.396304   \n",
       "176        3     56  99.390295  99.392517  99.397438  99.402816  99.409873   \n",
       "177        3     57  99.387922  99.390261  99.394830  99.400812  99.407458   \n",
       "178        3     58  99.390348  99.391047  99.394922  99.401168  99.408396   \n",
       "179        3     59  99.377725  99.378153  99.381078  99.385643  99.392011   \n",
       "\n",
       "             5          6          7  ...        561        562        563  \\\n",
       "0    -0.585762  -0.577419  -0.570175  ...  -0.980385  -0.980328  -0.980220   \n",
       "1    -0.590507  -0.581617  -0.572926  ...  -0.979335  -0.979523  -0.980038   \n",
       "2    -0.585245  -0.577118  -0.568827  ...  -0.979663  -0.979964  -0.980563   \n",
       "3    -0.597508  -0.589047  -0.580697  ...  -0.969902  -0.970586  -0.970718   \n",
       "4    -0.597607  -0.589165  -0.581424  ...  -0.977831  -0.978376  -0.978778   \n",
       "..         ...        ...        ...  ...        ...        ...        ...   \n",
       "175  99.405102  99.414323  99.422454  ...  99.033363  99.032615  99.032609   \n",
       "176  99.418803  99.427823  99.436244  ...  99.023249  99.022934  99.022428   \n",
       "177  99.416016  99.425299  99.433606  ...  99.026371  99.026007  99.025971   \n",
       "178  99.416801  99.425483  99.433159  ...  99.024331  99.023934  99.023716   \n",
       "179  99.400396  99.408790  99.416355  ...  99.030874  99.030576  99.030334   \n",
       "\n",
       "           564        565        566        567        568        569  target  \n",
       "0    -0.980691  -0.981337  -0.982336  -0.983213  -0.983672  -0.983120     1.0  \n",
       "1    -0.981146  -0.982332  -0.982570  -0.982630  -0.982850  -0.982549     1.0  \n",
       "2    -0.981326  -0.982744  -0.983107  -0.983033  -0.983956  -0.983858     1.0  \n",
       "3    -0.971197  -0.972268  -0.972654  -0.972861  -0.973671  -0.973614     1.0  \n",
       "4    -0.979656  -0.981148  -0.981796  -0.981331  -0.981289  -0.981331     1.0  \n",
       "..         ...        ...        ...        ...        ...        ...     ...  \n",
       "175  99.032021  99.031171  99.031198  99.030609  99.030441  99.030480   104.0  \n",
       "176  99.021527  99.020822  99.020762  99.020462  99.019507  99.019367   104.0  \n",
       "177  99.025246  99.024581  99.024234  99.023587  99.023002  99.023483   104.0  \n",
       "178  99.022909  99.021966  99.021285  99.021127  99.020634  99.020106   104.0  \n",
       "179  99.029671  99.028706  99.028079  99.027955  99.026948  99.026330   104.0  \n",
       "\n",
       "[180 rows x 573 columns]"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ds_name = 'OliveOil'\n",
    "X, y, _ = get_UCR_data(ds_name, return_split=False)\n",
    "X = X[:, 0]\n",
    "y = y.reshape(-1, 1)\n",
    "data = np.concatenate((X, y), axis=-1)\n",
    "df = pd.DataFrame(data).astype(float)\n",
    "df = df.rename(columns={570: 'target'})\n",
    "df1 = pd.concat([df, df + 10, df + 100], axis=0).reset_index(drop=False)\n",
    "df2 = pd.DataFrame(np.array([1] * 60 + [2] * 60 + [3] * 60), columns=['feature'])\n",
    "df = pd.merge(df2, df1, left_index=True, right_index=True)\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "X, y = df2xy(df, sample_col='index', feat_col='feature', target_col='target', data_cols=None)\n",
    "test_eq(X.shape, (60, 3, 570))\n",
    "test_eq(y.shape, (60, 3))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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feLEiUe3bdv2iiRdf/31k8aOHXt05cqVb3Zub29v14gRI3rcd/78+Yfmz59/KK1Y+3MrwWpJF6c1IAAAAAAA+EOXX375lKuvvvrsmTNnnnPddddVr1+/fsysWbPOqampmTF79uxzGhsbR0rSo48+evKFF144TcoXFZYsWTJlzpw506urq9+/atWqMwY67jGvGIiIjbanDPiIAAAAAADAgOzdu/ekzZs3b6uoqFBra2vZCy+8sG3EiBF66KGHTr7hhhuqH3/88V9132fnzp2jnn/++e1tbW3lNTU1tV//+tdbRo4c2e/5E1KbY8D2tZKuzS+dnVa3AAAAAABkxqc+9an9FRX5r+qtra3lV1555bt37do1yna0t7e7p30WLVrUNnr06Bg9enSusrKyfc+ePRVTp05t7++YqT2VICJ+GBHnRcR5UlVa3QIAAAAAkBljx47t6Hy9YsWKyRdccMFbO3bsePmRRx7ZeeTIkR6/w3e9OqC8vFy5XK7HAkJveFwhAAAAAAAnoAMHDpRXV1cfkaQf/OAH44dqHAoDAAAAAACcgFasWNF08803V9fU1MzI5XJDNk5/Hle4VtICSeNt75F0U0TcNWQRAQAAAABwnB3r8YJD6dZbb32jp/UXXXTR27t27drSufy9733vDUlavHjxW4sXL36rp3137Njx8kDH789TCT4z0E4BAAAAAEBp4FYCAAAAAAAyjMIAAAAAAAAZRmEAAAAAAIAMozAAAAAAAECGURgAAAAAACDDKAwAAAAAAHCczZ07933r1q07peu6lStXnrF06dKze2o/Z86c6Rs3bhwjSRdccMG0ffv2lXdvc/3110+68cYbJww0lmM+rhAAAAAAgOGufnN9fZr9NXygoaGv7UuWLGldu3Zt5eWXX36gc926desqv/Od7+w5Vt8bNmzYmUaMnbhiAAAAAACA4+yaa67Z/9RTT407fPiwJWn79u0nNTc3j7jnnnsqa2tra6ZNm3buV7/61Uk97Tt58uT37927t0KSVqxYMXHKlCm19fX103fs2DGykFiG6IqBhoOStw9N3+nbPKi6kNMKA70bL2lfITuW2ntbrHizNq4GkVOlptT+DQxWqeVU1t6fUlT4ezToz8YCP6fIC/whcqp/+EwekOnFDmA4mDBhwtG6urq377///nHLli1rW7NmTeWll166/5Zbbtk7YcKE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\n",
      "text/plain": [
       "<Figure size 1152x36 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "((#48) [58,21,9,45,41,54,56,46,44,53...],\n",
       " (#12) [55,38,40,18,16,24,3,28,50,14...])"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "splits = get_splits(y, valid_size=.2, stratify=True, random_state=23, shuffle=True)\n",
    "splits"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(#60) [(TSTensor(vars:3, len:570, device=cpu), tensor([  4.,  14., 104.])), (TSTensor(vars:3, len:570, device=cpu), tensor([  4.,  14., 104.])), (TSTensor(vars:3, len:570, device=cpu), tensor([  2.,  12., 102.])), (TSTensor(vars:3, len:570, device=cpu), tensor([  3.,  13., 103.])), (TSTensor(vars:3, len:570, device=cpu), tensor([  2.,  12., 102.])), (TSTensor(vars:3, len:570, device=cpu), tensor([  4.,  14., 104.])), (TSTensor(vars:3, len:570, device=cpu), tensor([  4.,  14., 104.])), (TSTensor(vars:3, len:570, device=cpu), tensor([  3.,  13., 103.])), (TSTensor(vars:3, len:570, device=cpu), tensor([  3.,  13., 103.])), (TSTensor(vars:3, len:570, device=cpu), tensor([  4.,  14., 104.]))] ...]"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tfms  = [None, TSRegression()]\n",
    "dsets = TSDatasets(X, y, tfms=tfms, splits=splits, inplace=True)\n",
    "dsets"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Single, long time series 🤥"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Sometimes, instead of having the data already split into samples, you only have a single (univariate or multivariate) time series that you need to split. \n",
    "The recommended way to do this is to use a sliding window. In `timeseriesAI`there is a function called `SlidingWindow`that performs this task in a flexible way.\n",
    "\n",
    "This function applies a sliding window to a 1d or 2d input (np.ndarray, torch.Tensor or pd.DataFrame). \n",
    "   \n",
    "* Args:\n",
    "    * window_length   = length of lookback window\n",
    "    * stride          = n datapoints the window is moved ahead along the sequence. Default: 1. If None, stride=window_length (no overlap)\n",
    "    * horizon         = number of future datapoints to predict. 0 for last step in the selected window. > 0 for future steps. List for several steps.\n",
    "    * get_x          = indices of columns that contain the independent variable (xs). If get_x=None, all data will be used as x\n",
    "    * get_y          = indices of columns that contain the target (ys). If y_idx is None, no y will be returned\n",
    "    * seq_first       = True if input shape (seq_len, n_vars), False if input shape (n_vars, seq_len)\n",
    "    * random_start    = determines the step where the first window is applied: 0 (default), a given step (int), or random within the 1st stride (None). \n",
    "\n",
    "* Input:\n",
    "    * shape: (seq_len, ) or (seq_len, n_vars) if seq_first=True else (n_vars, seq_len)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Univariate"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You may use it just without a target"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "input shape: (100,)\n"
     ]
    }
   ],
   "source": [
    "window_length = 5\n",
    "t = np.arange(100)\n",
    "print('input shape:', t.shape)\n",
    "X, y = SlidingWindow(window_length)(t)\n",
    "test_eq(X.shape, ((95, 1, 5)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If the target is the next step in the univariate time series set `horizon=1`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "input shape: (100,)\n"
     ]
    }
   ],
   "source": [
    "window_length = 5\n",
    "horizon = 1\n",
    "\n",
    "t = np.arange(100)\n",
    "print('input shape:', t.shape)\n",
    "X, y = SlidingWindow(window_length, horizon=horizon)(t)\n",
    "test_eq(X.shape, ((95, 1, 5)))\n",
    "test_eq(y.shape, ((95,)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Horizon may be > 1 to select multiple steps in the future:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "input shape: (100,)\n"
     ]
    }
   ],
   "source": [
    "window_length = 5\n",
    "horizon = 2\n",
    "\n",
    "t = np.arange(100)\n",
    "print('input shape:', t.shape)\n",
    "X, y = SlidingWindow(window_length, horizon=horizon)(t)\n",
    "test_eq(X.shape, ((94, 1, 5)))\n",
    "test_eq(y.shape, ((94, 2)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To have non-overlapping samples, we need to set `stride=None`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "input shape: (100,)\n"
     ]
    }
   ],
   "source": [
    "window_length = 5\n",
    "stride = None\n",
    "horizon = 1\n",
    "t = np.arange(100)\n",
    "print('input shape:', t.shape)\n",
    "X, y = SlidingWindow(window_length, stride=stride, horizon=horizon)(t)\n",
    "test_eq(X.shape, ((19, 1, 5)))\n",
    "test_eq(y.shape, ((19, )))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "input shape: (100,)\n"
     ]
    }
   ],
   "source": [
    "window_length = 5\n",
    "stride = 3\n",
    "horizon = 1\n",
    "t = np.arange(100)\n",
    "print('input shape:', t.shape)\n",
    "X, y = SlidingWindow(window_length, stride=stride, horizon=horizon)(t)\n",
    "test_eq(X.shape, ((32, 1, 5)))\n",
    "test_eq(y.shape, ((32, )))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can also decide where to start the sliding window using `start`: "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "input shape: (100,)\n"
     ]
    }
   ],
   "source": [
    "window_length = 5\n",
    "stride = None\n",
    "horizon = 1\n",
    "t = np.arange(100)\n",
    "print('input shape:', t.shape)\n",
    "X, y = SlidingWindow(window_length, stride=stride, start=20, horizon=horizon)(t)\n",
    "test_eq(X.shape, ((15, 1, 5)))\n",
    "test_eq(y.shape, ((15, )))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If the time series is of shape (1, seq_len) we need to set `seq_first=False`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "input shape: (1, 100)\n"
     ]
    }
   ],
   "source": [
    "window_length = 5\n",
    "stride = 3\n",
    "horizon = 1\n",
    "t = np.arange(100).reshape(1, -1)\n",
    "print('input shape:', t.shape)\n",
    "X, y = SlidingWindow(window_length, stride=stride, horizon=horizon, seq_first=False)(t)\n",
    "test_eq(X.shape, ((32, 1, 5)))\n",
    "test_eq(y.shape, ((32, )))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Your univariate time series may be in a pandas DataFrame:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "input shape: (20, 1)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>var</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>13</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>14</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>16</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>18</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>19</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    var\n",
       "0     0\n",
       "1     1\n",
       "2     2\n",
       "3     3\n",
       "4     4\n",
       "5     5\n",
       "6     6\n",
       "7     7\n",
       "8     8\n",
       "9     9\n",
       "10   10\n",
       "11   11\n",
       "12   12\n",
       "13   13\n",
       "14   14\n",
       "15   15\n",
       "16   16\n",
       "17   17\n",
       "18   18\n",
       "19   19"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "window_length = 5\n",
    "stride = None\n",
    "horizon=1\n",
    "\n",
    "t = np.arange(20)\n",
    "df = pd.DataFrame(t, columns=['var'])\n",
    "print('input shape:', df.shape)\n",
    "display(df)\n",
    "X, y = SlidingWindow(window_length, stride=stride, horizon=horizon)(df)\n",
    "test_eq(X.shape, ((3, 1, 5)))\n",
    "test_eq(y.shape, ((3, )))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "input shape: (1, 20)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>7</th>\n",
       "      <th>8</th>\n",
       "      <th>9</th>\n",
       "      <th>10</th>\n",
       "      <th>11</th>\n",
       "      <th>12</th>\n",
       "      <th>13</th>\n",
       "      <th>14</th>\n",
       "      <th>15</th>\n",
       "      <th>16</th>\n",
       "      <th>17</th>\n",
       "      <th>18</th>\n",
       "      <th>19</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>var</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>4</td>\n",
       "      <td>5</td>\n",
       "      <td>6</td>\n",
       "      <td>7</td>\n",
       "      <td>8</td>\n",
       "      <td>9</td>\n",
       "      <td>10</td>\n",
       "      <td>11</td>\n",
       "      <td>12</td>\n",
       "      <td>13</td>\n",
       "      <td>14</td>\n",
       "      <td>15</td>\n",
       "      <td>16</td>\n",
       "      <td>17</td>\n",
       "      <td>18</td>\n",
       "      <td>19</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  \\\n",
       "var   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17   \n",
       "\n",
       "     18  19  \n",
       "var  18  19  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "window_length = 5\n",
    "stride = None\n",
    "horizon=1\n",
    "\n",
    "t = np.arange(20)\n",
    "df = pd.DataFrame(t, columns=['var']).T\n",
    "print('input shape:', df.shape)\n",
    "display(df)\n",
    "X, y = SlidingWindow(window_length, stride=stride, horizon=horizon, seq_first=False)(df)\n",
    "test_eq(X.shape, ((3, 1, 5)))\n",
    "test_eq(y.shape, ((3, )))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Multivariate"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "When using multivariate data, all parameters shown before work in the same way, but you always need to indicate how to get the X data and the y data (as there are multiple features). To do that, we'll use get_x and get_y. \n",
    "\n",
    "By default get_x is set to None, which means that all features will be used.\n",
    "By default get_y is set to None, which means that all features will be used as long as horizon > 0 (to avoid leakage).\n",
    "\n",
    "If you get the time series in a np.ndarray or a torch.Tensor, you should use integers, a list or slice as get_x/ get_y."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1000, 3)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "window_length = 5\n",
    "stride = None\n",
    "n_vars = 3\n",
    "\n",
    "t = (np.random.rand(1000, n_vars) - .5).cumsum(0)\n",
    "print(t.shape)\n",
    "plt.plot(t)\n",
    "plt.show()\n",
    "X, y = SlidingWindow(window_length, stride=stride, get_x=[0,1], get_y=2)(t)\n",
    "test_eq(X.shape, ((199, 2, 5)))\n",
    "test_eq(y.shape, ((199, )))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "input shape: (10, 3)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>var_0</th>\n",
       "      <th>var_1</th>\n",
       "      <th>var_2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>tensor(0)</td>\n",
       "      <td>tensor(0)</td>\n",
       "      <td>tensor(0)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>tensor(1)</td>\n",
       "      <td>tensor(10)</td>\n",
       "      <td>tensor(100)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>tensor(2)</td>\n",
       "      <td>tensor(20)</td>\n",
       "      <td>tensor(200)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>tensor(3)</td>\n",
       "      <td>tensor(30)</td>\n",
       "      <td>tensor(300)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>tensor(4)</td>\n",
       "      <td>tensor(40)</td>\n",
       "      <td>tensor(400)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>tensor(5)</td>\n",
       "      <td>tensor(50)</td>\n",
       "      <td>tensor(500)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>tensor(6)</td>\n",
       "      <td>tensor(60)</td>\n",
       "      <td>tensor(600)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>tensor(7)</td>\n",
       "      <td>tensor(70)</td>\n",
       "      <td>tensor(700)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>tensor(8)</td>\n",
       "      <td>tensor(80)</td>\n",
       "      <td>tensor(800)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>tensor(9)</td>\n",
       "      <td>tensor(90)</td>\n",
       "      <td>tensor(900)</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       var_0       var_1        var_2\n",
       "0  tensor(0)   tensor(0)    tensor(0)\n",
       "1  tensor(1)  tensor(10)  tensor(100)\n",
       "2  tensor(2)  tensor(20)  tensor(200)\n",
       "3  tensor(3)  tensor(30)  tensor(300)\n",
       "4  tensor(4)  tensor(40)  tensor(400)\n",
       "5  tensor(5)  tensor(50)  tensor(500)\n",
       "6  tensor(6)  tensor(60)  tensor(600)\n",
       "7  tensor(7)  tensor(70)  tensor(700)\n",
       "8  tensor(8)  tensor(80)  tensor(800)\n",
       "9  tensor(9)  tensor(90)  tensor(900)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "window_length = 5\n",
    "n_vars = 3\n",
    "\n",
    "t = (torch.stack(n_vars * [torch.arange(10)]).T * tensor([1, 10, 100]))\n",
    "df = pd.DataFrame(t, columns=[f'var_{i}' for i in range(n_vars)])\n",
    "print('input shape:', df.shape)\n",
    "display(df)\n",
    "X, y = SlidingWindow(window_length)(df)\n",
    "test_eq(X.shape, ((5, 3, 5)))\n",
    "test_eq(y.shape, ((5, 3)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "input shape: (10, 3)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>var_0</th>\n",
       "      <th>var_1</th>\n",
       "      <th>var_2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>tensor(0)</td>\n",
       "      <td>tensor(0)</td>\n",
       "      <td>tensor(0)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>tensor(1)</td>\n",
       "      <td>tensor(10)</td>\n",
       "      <td>tensor(100)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>tensor(2)</td>\n",
       "      <td>tensor(20)</td>\n",
       "      <td>tensor(200)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>tensor(3)</td>\n",
       "      <td>tensor(30)</td>\n",
       "      <td>tensor(300)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>tensor(4)</td>\n",
       "      <td>tensor(40)</td>\n",
       "      <td>tensor(400)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>tensor(5)</td>\n",
       "      <td>tensor(50)</td>\n",
       "      <td>tensor(500)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>tensor(6)</td>\n",
       "      <td>tensor(60)</td>\n",
       "      <td>tensor(600)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>tensor(7)</td>\n",
       "      <td>tensor(70)</td>\n",
       "      <td>tensor(700)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>tensor(8)</td>\n",
       "      <td>tensor(80)</td>\n",
       "      <td>tensor(800)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>tensor(9)</td>\n",
       "      <td>tensor(90)</td>\n",
       "      <td>tensor(900)</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       var_0       var_1        var_2\n",
       "0  tensor(0)   tensor(0)    tensor(0)\n",
       "1  tensor(1)  tensor(10)  tensor(100)\n",
       "2  tensor(2)  tensor(20)  tensor(200)\n",
       "3  tensor(3)  tensor(30)  tensor(300)\n",
       "4  tensor(4)  tensor(40)  tensor(400)\n",
       "5  tensor(5)  tensor(50)  tensor(500)\n",
       "6  tensor(6)  tensor(60)  tensor(600)\n",
       "7  tensor(7)  tensor(70)  tensor(700)\n",
       "8  tensor(8)  tensor(80)  tensor(800)\n",
       "9  tensor(9)  tensor(90)  tensor(900)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "window_length = 5\n",
    "n_vars = 3\n",
    "horizon = 1\n",
    "\n",
    "t = (torch.stack(n_vars * [torch.arange(10)]).T * tensor([1, 10, 100]))\n",
    "df = pd.DataFrame(t, columns=[f'var_{i}' for i in range(n_vars)])\n",
    "print('input shape:', df.shape)\n",
    "display(df)\n",
    "X, y = SlidingWindow(window_length, horizon=horizon)(df)\n",
    "test_eq(X.shape, ((5, 3, 5)))\n",
    "test_eq(y.shape, ((5, 3)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You may also get the target from a different column: "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "input shape: (10, 3)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>var_0</th>\n",
       "      <th>var_1</th>\n",
       "      <th>target</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>tensor(0)</td>\n",
       "      <td>tensor(0)</td>\n",
       "      <td>tensor(0)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>tensor(1)</td>\n",
       "      <td>tensor(10)</td>\n",
       "      <td>tensor(100)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>tensor(2)</td>\n",
       "      <td>tensor(20)</td>\n",
       "      <td>tensor(200)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>tensor(3)</td>\n",
       "      <td>tensor(30)</td>\n",
       "      <td>tensor(300)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>tensor(4)</td>\n",
       "      <td>tensor(40)</td>\n",
       "      <td>tensor(400)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>tensor(5)</td>\n",
       "      <td>tensor(50)</td>\n",
       "      <td>tensor(500)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>tensor(6)</td>\n",
       "      <td>tensor(60)</td>\n",
       "      <td>tensor(600)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>tensor(7)</td>\n",
       "      <td>tensor(70)</td>\n",
       "      <td>tensor(700)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>tensor(8)</td>\n",
       "      <td>tensor(80)</td>\n",
       "      <td>tensor(800)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>tensor(9)</td>\n",
       "      <td>tensor(90)</td>\n",
       "      <td>tensor(900)</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       var_0       var_1       target\n",
       "0  tensor(0)   tensor(0)    tensor(0)\n",
       "1  tensor(1)  tensor(10)  tensor(100)\n",
       "2  tensor(2)  tensor(20)  tensor(200)\n",
       "3  tensor(3)  tensor(30)  tensor(300)\n",
       "4  tensor(4)  tensor(40)  tensor(400)\n",
       "5  tensor(5)  tensor(50)  tensor(500)\n",
       "6  tensor(6)  tensor(60)  tensor(600)\n",
       "7  tensor(7)  tensor(70)  tensor(700)\n",
       "8  tensor(8)  tensor(80)  tensor(800)\n",
       "9  tensor(9)  tensor(90)  tensor(900)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "window_length = 5\n",
    "n_vars = 3\n",
    "\n",
    "t = (torch.stack(n_vars * [torch.arange(10)]).T * tensor([1, 10, 100]))\n",
    "columns=[f'var_{i}' for i in range(n_vars-1)]+['target']\n",
    "df = pd.DataFrame(t, columns=columns)\n",
    "print('input shape:', df.shape)\n",
    "display(df)\n",
    "X, y = SlidingWindow(window_length, get_x=columns[:-1], get_y='target')(df)\n",
    "test_eq(X.shape, ((5, 2, 5)))\n",
    "test_eq(y.shape, ((5, )))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "input shape: (10, 5)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>var_0</th>\n",
       "      <th>var_1</th>\n",
       "      <th>var_2</th>\n",
       "      <th>var_3</th>\n",
       "      <th>target</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>tensor(0)</td>\n",
       "      <td>tensor(0)</td>\n",
       "      <td>tensor(0)</td>\n",
       "      <td>tensor(0)</td>\n",
       "      <td>tensor(0)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>tensor(1)</td>\n",
       "      <td>tensor(10)</td>\n",
       "      <td>tensor(100)</td>\n",
       "      <td>tensor(1000)</td>\n",
       "      <td>tensor(10000)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>tensor(2)</td>\n",
       "      <td>tensor(20)</td>\n",
       "      <td>tensor(200)</td>\n",
       "      <td>tensor(2000)</td>\n",
       "      <td>tensor(20000)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>tensor(3)</td>\n",
       "      <td>tensor(30)</td>\n",
       "      <td>tensor(300)</td>\n",
       "      <td>tensor(3000)</td>\n",
       "      <td>tensor(30000)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>tensor(4)</td>\n",
       "      <td>tensor(40)</td>\n",
       "      <td>tensor(400)</td>\n",
       "      <td>tensor(4000)</td>\n",
       "      <td>tensor(40000)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>tensor(5)</td>\n",
       "      <td>tensor(50)</td>\n",
       "      <td>tensor(500)</td>\n",
       "      <td>tensor(5000)</td>\n",
       "      <td>tensor(50000)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>tensor(6)</td>\n",
       "      <td>tensor(60)</td>\n",
       "      <td>tensor(600)</td>\n",
       "      <td>tensor(6000)</td>\n",
       "      <td>tensor(60000)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>tensor(7)</td>\n",
       "      <td>tensor(70)</td>\n",
       "      <td>tensor(700)</td>\n",
       "      <td>tensor(7000)</td>\n",
       "      <td>tensor(70000)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>tensor(8)</td>\n",
       "      <td>tensor(80)</td>\n",
       "      <td>tensor(800)</td>\n",
       "      <td>tensor(8000)</td>\n",
       "      <td>tensor(80000)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>tensor(9)</td>\n",
       "      <td>tensor(90)</td>\n",
       "      <td>tensor(900)</td>\n",
       "      <td>tensor(9000)</td>\n",
       "      <td>tensor(90000)</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       var_0       var_1        var_2         var_3         target\n",
       "0  tensor(0)   tensor(0)    tensor(0)     tensor(0)      tensor(0)\n",
       "1  tensor(1)  tensor(10)  tensor(100)  tensor(1000)  tensor(10000)\n",
       "2  tensor(2)  tensor(20)  tensor(200)  tensor(2000)  tensor(20000)\n",
       "3  tensor(3)  tensor(30)  tensor(300)  tensor(3000)  tensor(30000)\n",
       "4  tensor(4)  tensor(40)  tensor(400)  tensor(4000)  tensor(40000)\n",
       "5  tensor(5)  tensor(50)  tensor(500)  tensor(5000)  tensor(50000)\n",
       "6  tensor(6)  tensor(60)  tensor(600)  tensor(6000)  tensor(60000)\n",
       "7  tensor(7)  tensor(70)  tensor(700)  tensor(7000)  tensor(70000)\n",
       "8  tensor(8)  tensor(80)  tensor(800)  tensor(8000)  tensor(80000)\n",
       "9  tensor(9)  tensor(90)  tensor(900)  tensor(9000)  tensor(90000)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "window_length = 5\n",
    "n_vars = 5\n",
    "horizon = 1\n",
    "\n",
    "t = (torch.stack(n_vars * [torch.arange(10)]).T * tensor([10**i for i in range(n_vars)]))\n",
    "columns=[f'var_{i}' for i in range(n_vars-1)]+['target']\n",
    "df = pd.DataFrame(t, columns=columns)\n",
    "print('input shape:', df.shape)\n",
    "display(df)\n",
    "X, y = SlidingWindow(window_length, horizon=horizon, get_x=columns[:-1], get_y='target')(df)\n",
    "test_eq(X.shape, ((5, 4, 5)))\n",
    "test_eq(y.shape, ((5, )))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "input shape: (100, 5)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>var_0</th>\n",
       "      <th>var_1</th>\n",
       "      <th>var_2</th>\n",
       "      <th>var_3</th>\n",
       "      <th>target</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-0.278922</td>\n",
       "      <td>-0.090157</td>\n",
       "      <td>0.107557</td>\n",
       "      <td>-0.331229</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.439346</td>\n",
       "      <td>-0.393919</td>\n",
       "      <td>0.276158</td>\n",
       "      <td>-0.230226</td>\n",
       "      <td>8.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-0.335883</td>\n",
       "      <td>-0.572737</td>\n",
       "      <td>0.272000</td>\n",
       "      <td>0.254256</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-0.630172</td>\n",
       "      <td>-0.865450</td>\n",
       "      <td>-0.056542</td>\n",
       "      <td>0.086401</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-0.793439</td>\n",
       "      <td>-0.649630</td>\n",
       "      <td>-0.376331</td>\n",
       "      <td>0.210082</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>95</th>\n",
       "      <td>0.958701</td>\n",
       "      <td>0.647505</td>\n",
       "      <td>2.281029</td>\n",
       "      <td>7.588593</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>96</th>\n",
       "      <td>0.469621</td>\n",
       "      <td>0.733098</td>\n",
       "      <td>2.399453</td>\n",
       "      <td>7.154065</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>97</th>\n",
       "      <td>0.536770</td>\n",
       "      <td>0.994313</td>\n",
       "      <td>2.125393</td>\n",
       "      <td>7.445057</td>\n",
       "      <td>9.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>98</th>\n",
       "      <td>0.971073</td>\n",
       "      <td>0.661072</td>\n",
       "      <td>2.073313</td>\n",
       "      <td>7.867993</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>99</th>\n",
       "      <td>1.390952</td>\n",
       "      <td>0.549541</td>\n",
       "      <td>2.475450</td>\n",
       "      <td>7.624701</td>\n",
       "      <td>8.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>100 rows × 5 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "       var_0     var_1     var_2     var_3  target\n",
       "0  -0.278922 -0.090157  0.107557 -0.331229     0.0\n",
       "1  -0.439346 -0.393919  0.276158 -0.230226     8.0\n",
       "2  -0.335883 -0.572737  0.272000  0.254256     5.0\n",
       "3  -0.630172 -0.865450 -0.056542  0.086401     2.0\n",
       "4  -0.793439 -0.649630 -0.376331  0.210082     2.0\n",
       "..       ...       ...       ...       ...     ...\n",
       "95  0.958701  0.647505  2.281029  7.588593     3.0\n",
       "96  0.469621  0.733098  2.399453  7.154065     3.0\n",
       "97  0.536770  0.994313  2.125393  7.445057     9.0\n",
       "98  0.971073  0.661072  2.073313  7.867993     5.0\n",
       "99  1.390952  0.549541  2.475450  7.624701     8.0\n",
       "\n",
       "[100 rows x 5 columns]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1152x36 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "(#96) [(TSTensor(vars:4, len:4, device=cpu), TensorCategory(2)), (TSTensor(vars:4, len:4, device=cpu), TensorCategory(5)), (TSTensor(vars:4, len:4, device=cpu), TensorCategory(4)), (TSTensor(vars:4, len:4, device=cpu), TensorCategory(9)), (TSTensor(vars:4, len:4, device=cpu), TensorCategory(0)), (TSTensor(vars:4, len:4, device=cpu), TensorCategory(8)), (TSTensor(vars:4, len:4, device=cpu), TensorCategory(0)), (TSTensor(vars:4, len:4, device=cpu), TensorCategory(7)), (TSTensor(vars:4, len:4, device=cpu), TensorCategory(7)), (TSTensor(vars:4, len:4, device=cpu), TensorCategory(4))] ...]"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "window_length = 4\n",
    "n_vars = 5\n",
    "seq_len = 100\n",
    "horizon = 1\n",
    "\n",
    "t1 = (np.random.rand(seq_len, n_vars-1) - .5).cumsum(0)\n",
    "t2 = np.random.randint(0, 10, (seq_len,1))\n",
    "t = np.concatenate((t1, t2), axis=-1)\n",
    "columns=[f'var_{i}' for i in range(n_vars-1)]+['target']\n",
    "df = pd.DataFrame(t, columns=columns)\n",
    "print('input shape:', df.shape)\n",
    "display(df)\n",
    "X, y = SlidingWindow(window_length, horizon=horizon, get_x=columns[:-1], get_y='target')(df)\n",
    "splits = get_splits(y, valid_size=.2, stratify=True, random_state=23, shuffle=False)\n",
    "tfms  = [None, [Categorize()]]\n",
    "dsets = TSDatasets(X, y, tfms=tfms, splits=splits, inplace=True)\n",
    "dsets"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(tensor([[-0.2789, -0.4393, -0.3359, -0.6302],\n",
       "         [-0.0902, -0.3939, -0.5727, -0.8654],\n",
       "         [ 0.1076,  0.2762,  0.2720, -0.0565],\n",
       "         [-0.3312, -0.2302,  0.2543,  0.0864]]),\n",
       " TensorCategory(2))"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dsets[0][0].data, dsets[0][1].data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "input shape: (5, 100)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>7</th>\n",
       "      <th>8</th>\n",
       "      <th>9</th>\n",
       "      <th>...</th>\n",
       "      <th>90</th>\n",
       "      <th>91</th>\n",
       "      <th>92</th>\n",
       "      <th>93</th>\n",
       "      <th>94</th>\n",
       "      <th>95</th>\n",
       "      <th>96</th>\n",
       "      <th>97</th>\n",
       "      <th>98</th>\n",
       "      <th>99</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>var_0</th>\n",
       "      <td>-0.396826</td>\n",
       "      <td>-0.584793</td>\n",
       "      <td>-0.753035</td>\n",
       "      <td>-1.235078</td>\n",
       "      <td>-1.175882</td>\n",
       "      <td>-0.858514</td>\n",
       "      <td>-1.014738</td>\n",
       "      <td>-0.988155</td>\n",
       "      <td>-1.286932</td>\n",
       "      <td>-1.338068</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.655102</td>\n",
       "      <td>-0.416278</td>\n",
       "      <td>-0.567191</td>\n",
       "      <td>-0.563334</td>\n",
       "      <td>-0.223816</td>\n",
       "      <td>-0.692494</td>\n",
       "      <td>-0.342047</td>\n",
       "      <td>-0.678553</td>\n",
       "      <td>-0.818982</td>\n",
       "      <td>-0.395287</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>var_1</th>\n",
       "      <td>0.101784</td>\n",
       "      <td>0.140790</td>\n",
       "      <td>-0.166500</td>\n",
       "      <td>-0.262055</td>\n",
       "      <td>-0.401538</td>\n",
       "      <td>0.015751</td>\n",
       "      <td>-0.227840</td>\n",
       "      <td>-0.124859</td>\n",
       "      <td>0.304027</td>\n",
       "      <td>0.686724</td>\n",
       "      <td>...</td>\n",
       "      <td>3.522454</td>\n",
       "      <td>3.707845</td>\n",
       "      <td>3.302698</td>\n",
       "      <td>3.501154</td>\n",
       "      <td>3.150482</td>\n",
       "      <td>3.033596</td>\n",
       "      <td>2.931937</td>\n",
       "      <td>2.812061</td>\n",
       "      <td>2.997631</td>\n",
       "      <td>3.144549</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>var_2</th>\n",
       "      <td>0.347239</td>\n",
       "      <td>0.509674</td>\n",
       "      <td>0.354078</td>\n",
       "      <td>0.252386</td>\n",
       "      <td>0.441122</td>\n",
       "      <td>0.842774</td>\n",
       "      <td>1.123163</td>\n",
       "      <td>0.684701</td>\n",
       "      <td>0.235142</td>\n",
       "      <td>0.070800</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.612066</td>\n",
       "      <td>-0.588531</td>\n",
       "      <td>-0.690947</td>\n",
       "      <td>-1.007796</td>\n",
       "      <td>-0.673262</td>\n",
       "      <td>-0.387539</td>\n",
       "      <td>-0.857754</td>\n",
       "      <td>-1.226365</td>\n",
       "      <td>-0.996411</td>\n",
       "      <td>-0.800580</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>var_3</th>\n",
       "      <td>-0.440455</td>\n",
       "      <td>-0.246624</td>\n",
       "      <td>0.192573</td>\n",
       "      <td>0.573121</td>\n",
       "      <td>0.191180</td>\n",
       "      <td>0.424844</td>\n",
       "      <td>0.244777</td>\n",
       "      <td>-0.060199</td>\n",
       "      <td>-0.522611</td>\n",
       "      <td>-0.345458</td>\n",
       "      <td>...</td>\n",
       "      <td>1.286289</td>\n",
       "      <td>1.525926</td>\n",
       "      <td>1.131440</td>\n",
       "      <td>0.790336</td>\n",
       "      <td>0.796382</td>\n",
       "      <td>0.752800</td>\n",
       "      <td>0.843915</td>\n",
       "      <td>0.646929</td>\n",
       "      <td>1.094649</td>\n",
       "      <td>0.820380</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>target</th>\n",
       "      <td>9.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>6.000000</td>\n",
       "      <td>8.000000</td>\n",
       "      <td>9.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>6.000000</td>\n",
       "      <td>5.000000</td>\n",
       "      <td>7.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>7.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 100 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "              0         1         2         3         4         5         6   \\\n",
       "var_0  -0.396826 -0.584793 -0.753035 -1.235078 -1.175882 -0.858514 -1.014738   \n",
       "var_1   0.101784  0.140790 -0.166500 -0.262055 -0.401538  0.015751 -0.227840   \n",
       "var_2   0.347239  0.509674  0.354078  0.252386  0.441122  0.842774  1.123163   \n",
       "var_3  -0.440455 -0.246624  0.192573  0.573121  0.191180  0.424844  0.244777   \n",
       "target  9.000000  2.000000  3.000000  2.000000  6.000000  8.000000  9.000000   \n",
       "\n",
       "              7         8         9   ...        90        91        92  \\\n",
       "var_0  -0.988155 -1.286932 -1.338068  ... -0.655102 -0.416278 -0.567191   \n",
       "var_1  -0.124859  0.304027  0.686724  ...  3.522454  3.707845  3.302698   \n",
       "var_2   0.684701  0.235142  0.070800  ... -0.612066 -0.588531 -0.690947   \n",
       "var_3  -0.060199 -0.522611 -0.345458  ...  1.286289  1.525926  1.131440   \n",
       "target  2.000000  2.000000  3.000000  ...  6.000000  5.000000  7.000000   \n",
       "\n",
       "              93        94        95        96        97        98        99  \n",
       "var_0  -0.563334 -0.223816 -0.692494 -0.342047 -0.678553 -0.818982 -0.395287  \n",
       "var_1   3.501154  3.150482  3.033596  2.931937  2.812061  2.997631  3.144549  \n",
       "var_2  -1.007796 -0.673262 -0.387539 -0.857754 -1.226365 -0.996411 -0.800580  \n",
       "var_3   0.790336  0.796382  0.752800  0.843915  0.646929  1.094649  0.820380  \n",
       "target  0.000000  4.000000  4.000000  7.000000  2.000000  4.000000  0.000000  \n",
       "\n",
       "[5 rows x 100 columns]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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7LNH3nzzzeUrV67sN3r06JGVlZWjxowZM7K2tra3JD333HPHX3jhhcOldFFhxowZFePGjRtRXl7+9YULF55yuP0e9I6BiFhtu+KwzwgAAAAAAByWurq649atW7eppKREjY2NRW+++eamXr166emnnz5+3rx55S+88MKvOr5n69atfd54443Nzc3NxZWVlVW33357Q+/evQ95/YSMrTFg+yZJN6W3Ts9UWAAAAAAACsYVV1zRVFKS/qje2NhYfNVVV52xbdu2PrajpaXFnb1n6tSpzX379o2+ffumSktLW3bs2FEybNiwlkPtM2NPJYiIByNibESMlcoyFRYAAAAAgILRv3//1rbX8+fPHzpp0qTPtmzZ8t6zzz67df/+/Z1+hm9/d0BxcbFSqVSnBYSu8LhCAAAAAAB6oN27dxeXl5fvl6QHHnhgYLb6oTAAAAAAAEAPNH/+/Pq77767vLKyclQqlcpaP47ofj0C20skTZY0UNInku6KiEe6f8/YkN7KVI4AAABA3jtnbUaflAZkzbqadWvTU8iPbbW1tduqq6t35TqPo6W2tnZgdXV1RWfHDuWpBNdkPCMAAAAAANAjMJUAAAAAAIACRmEAAAAAAIACRmEAAAAAAIACRmEAAAAAAIACRmEAAAAAAIACRmEAAAAAAICjbPz48V9bvnz5Ce33LViw4JRZs2ad3ln7cePGjVi9enU/SZo0adLwXbt2FXdsM3fu3CF33nnnoMPN5aCPKwQAAAAAIN/VrKupyWS8teesXdvd8RkzZjQuWbKkdPr06bvb9i1fvrz03nvv3XGw2KtWrdqaiRzbcMcAAAAAAABH2XXXXdf08ssvD9i3b58lafPmzcft3Lmz1+OPP15aVVVVOXz48LNuvfXWIZ29d+jQoV+vq6srkaT58+cPrqioqKqpqRmxZcuW3keSS5buGFi7R/Lm7MQGeqyBknblOgngKOKaRyHiukfWrMvod5UZxXWPjr6S6wTywaBBgw5UV1d/vmzZsgGzZ89uXrx4celll13WdM8999QNGjToQCqV0gUXXDBizZo1fcePH/9FZzFeffXVfk899VTpu+++u6GlpUWjR48eNWbMmL2Hm0u2phJsjoixWYoN9Ei23+K6RyHhmkch4rpHIeK6B7Jn5syZjUuXLj1p9uzZzStWrCh96KGHti1evLh00aJFA1OplBsaGnrV1tb26aowsHLlyv6XXHJJ8/HHH98qSVOnTm0+kjyYSgAAAAAAQA5ce+21za+//voJr732Wr99+/YVlZWVpe6///5Bq1atev/999/fMGXKlE/37duX9c/tFAYAAAAAAMiBAQMGtJ5//vmfzZkzp2LatGmNTU1NxX379m0tLS09sH379pJXXnllQHfvnzJlyp7nn3/+xD179ripqanopZdeOvFI8sjWVIIHsxQX6Mm47lFouOZRiLjuUYi47oEsuvrqqxuvv/76YUuWLPlgzJgx+6qqqvYOGzas6tRTT91fU1Ozp7v3TpgwYe+0adMaq6qqzjr55JNbzj777M+PJAdHxJFlDwAAAADAMaq2tnZbdXV1wSysWVtbO7C6urqis2NMJQAAAAAAoIBltDBg+yLbm21vtX1HJmMDPYXt02yvtL3B9nu2b0n2l9p+yfaW5O+Tcp0rkGm2i22/bfu5ZPsM22uScX+p7eNynSOQSbZPtL3M9ibbG22fz3iPfGf71uR3nPW2l9juw3gP5LeMFQZsF0v6uaSLJY2SdI3tUZmKD/QgKUm3RcQoSedJ+kFyrd8h6RcRcaakXyTbQL65RdLGdtt/K+kfImK4pCZJ38tJVkD2/EzSf0TESEnVSl//jPfIW7aHSvqhpLERUSWpWNLVYrwH8lom7xgYJ2lrRHwQEfsl/Yuk72QwPtAjRERdRKxLXn+m9C+JQ5W+3hcnzRZL+uOcJAhkie1ySd+W9HCybUlTJC1LmnDdI6/YHiBpoqRHJCki9kdEsxjvkf9KJPW1XSKpn6Q6Md4jP7W2trY610kcDcl5tnZ1PJOFgaGStrfb3pHsA/KW7QpJYyStkTQoIuqSQ/WSBuUqLyBL7pM0T7/9oXKypOaISCXbjPvIN2dIapD0WDKF5mHbfyDGe+SxiPhI0k8l/VrpgsCnktaK8R75aX1DQ8OAfC8OtLa2uqGhYYCk9V21ydbjCoG8Z7u/pOWS/jwidqe/PE2LiLDNIz+QN2xfKmlnRKy1PTnH6QBHS4mkcyT9WUSssf0zdZg2wHiPfJOsmfEdpQtjzZL+VdJFucwJyJZUKjWnvr7+4fr6+irl98L8rZLWp1KpOV01yGRh4CNJp7XbLk/2AXnHdi+liwJPRMSKZPcntk+NiDrbp0rambsMgYz7Q0mX275EUh9JJyg99/pE2yXJt0iM+8g3OyTtiIg1yfYypQsDjPfIZ9+S9D8R0SBJtlco/TOA8R55p6amZqeky3OdR0+QyarIm5LOTFYsPU7pRUqeyWB8oEdI5lU/ImljRPx9u0PPSLoheX2DpH872rkB2RIRfxkR5RFRofT4/nJEzJK0UtKVSTOue+SViKiXtN32iGTXNyVtEOM98tuvJZ1nu1/yO0/bdc94D+QxR2Tu7rfkm6T7lF699NGI+EnGggM9hO0Jkl6V9K5+O9f6r5ReZ+BJSadL+lDSzIhozEmSQBYlUwn+IiIutf1VpRebLZX0tqTZEfFlDtMDMsr2aKUX3DxO0geSvqv0FyuM98hbtn8s6Sqln8T0tqQ5Sq8pwHgP5KmMFgYAAAAAAMCxJZ8XWAAAAAAAAAdBYQAAAAAAgAJGYQAAAAAAgAJGYQAAAAAAgAJGYQAAAAAAgAJGYQAAAAAAgAJGYQAAAAAAgAJGYQAAAAAAgAL2v2ngly8JxJ76AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 1152x36 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "(#94) [(TSTensor(vars:4, len:4, device=cpu), TensorCategory(9)), (TSTensor(vars:4, len:4, device=cpu), TensorCategory(2)), (TSTensor(vars:4, len:4, device=cpu), TensorCategory(2)), (TSTensor(vars:4, len:4, device=cpu), TensorCategory(3)), (TSTensor(vars:4, len:4, device=cpu), TensorCategory(6)), (TSTensor(vars:4, len:4, device=cpu), TensorCategory(1)), (TSTensor(vars:4, len:4, device=cpu), TensorCategory(2)), (TSTensor(vars:4, len:4, device=cpu), TensorCategory(9)), (TSTensor(vars:4, len:4, device=cpu), TensorCategory(7)), (TSTensor(vars:4, len:4, device=cpu), TensorCategory(3))] ...]"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "window_length = 4\n",
    "start = 3\n",
    "n_vars = 5\n",
    "seq_len = 100\n",
    "horizon = 0\n",
    "\n",
    "t1 = (np.random.rand(seq_len, n_vars-1) - .5).cumsum(0)\n",
    "t2 = np.random.randint(0, 10, (seq_len,1))\n",
    "t = np.concatenate((t1, t2), axis=-1)\n",
    "columns=[f'var_{i}' for i in range(n_vars-1)]+['target']\n",
    "df = pd.DataFrame(t, columns=columns).T\n",
    "print('input shape:', df.shape)\n",
    "display(df)\n",
    "X, y = SlidingWindow(window_length, start=start, horizon=horizon, get_x=columns[:-1], get_y='target', seq_first=False)(df)\n",
    "splits = get_splits(y, valid_size=.2, stratify=True, random_state=23, shuffle=False)\n",
    "tfms  = [None, [Categorize()]]\n",
    "dsets = TSDatasets(X, y, tfms=tfms, splits=splits, inplace=True)\n",
    "dsets"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(tensor([[-1.2351, -1.1759, -0.8585, -1.0147],\n",
       "         [-0.2621, -0.4015,  0.0158, -0.2278],\n",
       "         [ 0.2524,  0.4411,  0.8428,  1.1232],\n",
       "         [ 0.5731,  0.1912,  0.4248,  0.2448]]),\n",
       " TensorCategory(9))"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dsets[0][0].data, dsets[0][1].data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## End-to-end example 🎬"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Data split by sample"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This is a example using real data where the dataframe already has the data split by sample. Let's first simulate how you could get the pandas df.\n",
    "\n",
    "In this case, you only need to convert the dataframe format to X and y using `df2xy`as we have seen before."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>sample</th>\n",
       "      <th>feature</th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>7</th>\n",
       "      <th>...</th>\n",
       "      <th>42</th>\n",
       "      <th>43</th>\n",
       "      <th>44</th>\n",
       "      <th>45</th>\n",
       "      <th>46</th>\n",
       "      <th>47</th>\n",
       "      <th>48</th>\n",
       "      <th>49</th>\n",
       "      <th>50</th>\n",
       "      <th>target</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.372758</td>\n",
       "      <td>-0.367844</td>\n",
       "      <td>-0.378445</td>\n",
       "      <td>-0.386751</td>\n",
       "      <td>-0.417101</td>\n",
       "      <td>-0.447204</td>\n",
       "      <td>-0.423585</td>\n",
       "      <td>-0.318506</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.477529</td>\n",
       "      <td>-0.487402</td>\n",
       "      <td>-0.485995</td>\n",
       "      <td>-0.480247</td>\n",
       "      <td>-0.496073</td>\n",
       "      <td>-0.491603</td>\n",
       "      <td>-0.537007</td>\n",
       "      <td>-0.475939</td>\n",
       "      <td>-0.479505</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>-1.821679</td>\n",
       "      <td>-1.841987</td>\n",
       "      <td>-1.821358</td>\n",
       "      <td>-1.845643</td>\n",
       "      <td>-1.941721</td>\n",
       "      <td>-2.005778</td>\n",
       "      <td>-1.817611</td>\n",
       "      <td>-1.560247</td>\n",
       "      <td>...</td>\n",
       "      <td>-1.843810</td>\n",
       "      <td>-1.830620</td>\n",
       "      <td>-1.820712</td>\n",
       "      <td>-1.781465</td>\n",
       "      <td>-1.804775</td>\n",
       "      <td>-1.799706</td>\n",
       "      <td>-1.751323</td>\n",
       "      <td>-1.772353</td>\n",
       "      <td>-1.761632</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>-0.846321</td>\n",
       "      <td>-0.846325</td>\n",
       "      <td>-0.839571</td>\n",
       "      <td>-0.848031</td>\n",
       "      <td>-0.885500</td>\n",
       "      <td>-1.002093</td>\n",
       "      <td>-1.227122</td>\n",
       "      <td>-1.452898</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.737160</td>\n",
       "      <td>-0.750605</td>\n",
       "      <td>-0.727674</td>\n",
       "      <td>-0.726221</td>\n",
       "      <td>-0.749053</td>\n",
       "      <td>-0.776479</td>\n",
       "      <td>-0.603740</td>\n",
       "      <td>-0.763048</td>\n",
       "      <td>-0.793202</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0.465208</td>\n",
       "      <td>0.467033</td>\n",
       "      <td>0.471135</td>\n",
       "      <td>0.506153</td>\n",
       "      <td>0.611207</td>\n",
       "      <td>0.697417</td>\n",
       "      <td>0.721512</td>\n",
       "      <td>0.652092</td>\n",
       "      <td>...</td>\n",
       "      <td>0.510333</td>\n",
       "      <td>0.412795</td>\n",
       "      <td>0.412242</td>\n",
       "      <td>0.455973</td>\n",
       "      <td>0.446786</td>\n",
       "      <td>0.425194</td>\n",
       "      <td>0.434855</td>\n",
       "      <td>0.468405</td>\n",
       "      <td>0.460464</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>4</td>\n",
       "      <td>-2.015072</td>\n",
       "      <td>-2.007557</td>\n",
       "      <td>-2.010042</td>\n",
       "      <td>-2.032552</td>\n",
       "      <td>-1.953282</td>\n",
       "      <td>-1.861078</td>\n",
       "      <td>-1.699443</td>\n",
       "      <td>-1.253402</td>\n",
       "      <td>...</td>\n",
       "      <td>-1.953984</td>\n",
       "      <td>-2.004474</td>\n",
       "      <td>-1.991646</td>\n",
       "      <td>-1.997254</td>\n",
       "      <td>-1.998531</td>\n",
       "      <td>-1.976082</td>\n",
       "      <td>-1.960404</td>\n",
       "      <td>-2.006394</td>\n",
       "      <td>-1.969680</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8635</th>\n",
       "      <td>359</td>\n",
       "      <td>19</td>\n",
       "      <td>-1.658398</td>\n",
       "      <td>-1.617639</td>\n",
       "      <td>-1.623446</td>\n",
       "      <td>-1.690049</td>\n",
       "      <td>-1.596608</td>\n",
       "      <td>-1.631068</td>\n",
       "      <td>-1.524069</td>\n",
       "      <td>-1.515474</td>\n",
       "      <td>...</td>\n",
       "      <td>-1.195383</td>\n",
       "      <td>-1.413512</td>\n",
       "      <td>-1.810155</td>\n",
       "      <td>-1.614774</td>\n",
       "      <td>-1.684754</td>\n",
       "      <td>-1.659315</td>\n",
       "      <td>-1.705025</td>\n",
       "      <td>-1.678066</td>\n",
       "      <td>-1.641795</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8636</th>\n",
       "      <td>359</td>\n",
       "      <td>20</td>\n",
       "      <td>-0.679048</td>\n",
       "      <td>-0.654021</td>\n",
       "      <td>-0.656639</td>\n",
       "      <td>-0.711966</td>\n",
       "      <td>-0.742536</td>\n",
       "      <td>-0.748806</td>\n",
       "      <td>-0.806330</td>\n",
       "      <td>-0.913220</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.841650</td>\n",
       "      <td>-0.782175</td>\n",
       "      <td>-0.734422</td>\n",
       "      <td>-0.684311</td>\n",
       "      <td>-0.651485</td>\n",
       "      <td>-0.660619</td>\n",
       "      <td>-0.690759</td>\n",
       "      <td>-0.716252</td>\n",
       "      <td>-0.704824</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8637</th>\n",
       "      <td>359</td>\n",
       "      <td>21</td>\n",
       "      <td>0.499991</td>\n",
       "      <td>0.390842</td>\n",
       "      <td>0.396292</td>\n",
       "      <td>0.395197</td>\n",
       "      <td>0.441420</td>\n",
       "      <td>0.881352</td>\n",
       "      <td>1.140342</td>\n",
       "      <td>1.473447</td>\n",
       "      <td>...</td>\n",
       "      <td>1.686165</td>\n",
       "      <td>1.448840</td>\n",
       "      <td>1.241460</td>\n",
       "      <td>1.038313</td>\n",
       "      <td>0.870652</td>\n",
       "      <td>0.754220</td>\n",
       "      <td>0.568415</td>\n",
       "      <td>0.550804</td>\n",
       "      <td>0.562437</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8638</th>\n",
       "      <td>359</td>\n",
       "      <td>22</td>\n",
       "      <td>-1.664080</td>\n",
       "      <td>-1.725331</td>\n",
       "      <td>-1.686976</td>\n",
       "      <td>-1.650568</td>\n",
       "      <td>-1.716866</td>\n",
       "      <td>-1.749081</td>\n",
       "      <td>-1.737207</td>\n",
       "      <td>-1.571937</td>\n",
       "      <td>...</td>\n",
       "      <td>-1.136640</td>\n",
       "      <td>-1.347163</td>\n",
       "      <td>-1.513772</td>\n",
       "      <td>-1.617310</td>\n",
       "      <td>-1.659452</td>\n",
       "      <td>-1.727294</td>\n",
       "      <td>-1.877402</td>\n",
       "      <td>-1.903281</td>\n",
       "      <td>-1.895895</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8639</th>\n",
       "      <td>359</td>\n",
       "      <td>23</td>\n",
       "      <td>-0.733138</td>\n",
       "      <td>-0.718382</td>\n",
       "      <td>-0.705195</td>\n",
       "      <td>-0.694358</td>\n",
       "      <td>-0.675056</td>\n",
       "      <td>-0.671773</td>\n",
       "      <td>-0.556493</td>\n",
       "      <td>-0.490029</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.367544</td>\n",
       "      <td>-0.473136</td>\n",
       "      <td>-0.591317</td>\n",
       "      <td>-0.588854</td>\n",
       "      <td>-0.607189</td>\n",
       "      <td>-0.618963</td>\n",
       "      <td>-0.412571</td>\n",
       "      <td>-0.472645</td>\n",
       "      <td>-0.454302</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>8640 rows × 54 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      sample  feature         0         1         2         3         4  \\\n",
       "0          0        0 -0.372758 -0.367844 -0.378445 -0.386751 -0.417101   \n",
       "1          0        1 -1.821679 -1.841987 -1.821358 -1.845643 -1.941721   \n",
       "2          0        2 -0.846321 -0.846325 -0.839571 -0.848031 -0.885500   \n",
       "3          0        3  0.465208  0.467033  0.471135  0.506153  0.611207   \n",
       "4          0        4 -2.015072 -2.007557 -2.010042 -2.032552 -1.953282   \n",
       "...      ...      ...       ...       ...       ...       ...       ...   \n",
       "8635     359       19 -1.658398 -1.617639 -1.623446 -1.690049 -1.596608   \n",
       "8636     359       20 -0.679048 -0.654021 -0.656639 -0.711966 -0.742536   \n",
       "8637     359       21  0.499991  0.390842  0.396292  0.395197  0.441420   \n",
       "8638     359       22 -1.664080 -1.725331 -1.686976 -1.650568 -1.716866   \n",
       "8639     359       23 -0.733138 -0.718382 -0.705195 -0.694358 -0.675056   \n",
       "\n",
       "             5         6         7  ...        42        43        44  \\\n",
       "0    -0.447204 -0.423585 -0.318506  ... -0.477529 -0.487402 -0.485995   \n",
       "1    -2.005778 -1.817611 -1.560247  ... -1.843810 -1.830620 -1.820712   \n",
       "2    -1.002093 -1.227122 -1.452898  ... -0.737160 -0.750605 -0.727674   \n",
       "3     0.697417  0.721512  0.652092  ...  0.510333  0.412795  0.412242   \n",
       "4    -1.861078 -1.699443 -1.253402  ... -1.953984 -2.004474 -1.991646   \n",
       "...        ...       ...       ...  ...       ...       ...       ...   \n",
       "8635 -1.631068 -1.524069 -1.515474  ... -1.195383 -1.413512 -1.810155   \n",
       "8636 -0.748806 -0.806330 -0.913220  ... -0.841650 -0.782175 -0.734422   \n",
       "8637  0.881352  1.140342  1.473447  ...  1.686165  1.448840  1.241460   \n",
       "8638 -1.749081 -1.737207 -1.571937  ... -1.136640 -1.347163 -1.513772   \n",
       "8639 -0.671773 -0.556493 -0.490029  ... -0.367544 -0.473136 -0.591317   \n",
       "\n",
       "            45        46        47        48        49        50  target  \n",
       "0    -0.480247 -0.496073 -0.491603 -0.537007 -0.475939 -0.479505     4.0  \n",
       "1    -1.781465 -1.804775 -1.799706 -1.751323 -1.772353 -1.761632     4.0  \n",
       "2    -0.726221 -0.749053 -0.776479 -0.603740 -0.763048 -0.793202     4.0  \n",
       "3     0.455973  0.446786  0.425194  0.434855  0.468405  0.460464     4.0  \n",
       "4    -1.997254 -1.998531 -1.976082 -1.960404 -2.006394 -1.969680     4.0  \n",
       "...        ...       ...       ...       ...       ...       ...     ...  \n",
       "8635 -1.614774 -1.684754 -1.659315 -1.705025 -1.678066 -1.641795     4.0  \n",
       "8636 -0.684311 -0.651485 -0.660619 -0.690759 -0.716252 -0.704824     4.0  \n",
       "8637  1.038313  0.870652  0.754220  0.568415  0.550804  0.562437     4.0  \n",
       "8638 -1.617310 -1.659452 -1.727294 -1.877402 -1.903281 -1.895895     4.0  \n",
       "8639 -0.588854 -0.607189 -0.618963 -0.412571 -0.472645 -0.454302     4.0  \n",
       "\n",
       "[8640 rows x 54 columns]"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ds_name = 'NATOPS' \n",
    "X, y, splits = get_UCR_data(ds_name, return_split=False)\n",
    "data = np.concatenate((np.arange(len(X)).repeat(X.shape[1]).reshape(-1,1), np.tile(np.arange(X.shape[1]), len(X)).reshape(-1,1)), axis=1)\n",
    "df1 = pd.DataFrame(data, columns=['sample', 'feature'])\n",
    "df2 = pd.DataFrame(X.reshape(-1, 51))\n",
    "df3 = pd.DataFrame(np.repeat(y, X.shape[1]), columns=['target'])\n",
    "df = df1.merge(df2, left_index=True, right_index=True)\n",
    "df = df.merge(df3, left_index=True, right_index=True)\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In this case, we can shuffle the data as the individual time series are independent from the rest."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1152x36 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "(#360) [(TSTensor(vars:24, len:51, device=cpu), TensorCategory(0)), (TSTensor(vars:24, len:51, device=cpu), TensorCategory(0)), (TSTensor(vars:24, len:51, device=cpu), TensorCategory(0)), (TSTensor(vars:24, len:51, device=cpu), TensorCategory(0)), (TSTensor(vars:24, len:51, device=cpu), TensorCategory(0)), (TSTensor(vars:24, len:51, device=cpu), TensorCategory(0)), (TSTensor(vars:24, len:51, device=cpu), TensorCategory(0)), (TSTensor(vars:24, len:51, device=cpu), TensorCategory(0)), (TSTensor(vars:24, len:51, device=cpu), TensorCategory(0)), (TSTensor(vars:24, len:51, device=cpu), TensorCategory(0))] ...]"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def y_func(o): return o[0]\n",
    "X, y = df2xy(df, sample_col='sample', feat_col='feature', target_col='target', data_cols=df.columns[2:-1], y_func=y_func)\n",
    "splits = get_splits(y, valid_size=.2, stratify=True, random_state=23, shuffle=True)\n",
    "tfms  = [None, TSClassification()]\n",
    "dsets = TSDatasets(X, y, tfms=tfms, splits=splits)\n",
    "dsets"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Single multivariate time series"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In this second scenario, we have a single time series, and we'll need to decide how to create the individual samples using the `SlidingWindow`function.\n",
    "\n",
    "This is how you could get the dataframe, with many columns for each feature, and a target."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(360, 24, 51) (24, 18360)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>7</th>\n",
       "      <th>8</th>\n",
       "      <th>9</th>\n",
       "      <th>...</th>\n",
       "      <th>15</th>\n",
       "      <th>16</th>\n",
       "      <th>17</th>\n",
       "      <th>18</th>\n",
       "      <th>19</th>\n",
       "      <th>20</th>\n",
       "      <th>21</th>\n",
       "      <th>22</th>\n",
       "      <th>23</th>\n",
       "      <th>target</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-0.372758</td>\n",
       "      <td>-1.821679</td>\n",
       "      <td>-0.846321</td>\n",
       "      <td>0.465208</td>\n",
       "      <td>-2.015072</td>\n",
       "      <td>-0.839242</td>\n",
       "      <td>-0.564097</td>\n",
       "      <td>-0.796225</td>\n",
       "      <td>-0.149604</td>\n",
       "      <td>0.599967</td>\n",
       "      <td>...</td>\n",
       "      <td>0.577993</td>\n",
       "      <td>-1.534954</td>\n",
       "      <td>-0.673190</td>\n",
       "      <td>-0.536343</td>\n",
       "      <td>-1.626957</td>\n",
       "      <td>-0.594337</td>\n",
       "      <td>0.619205</td>\n",
       "      <td>-1.771773</td>\n",
       "      <td>-0.810086</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.367844</td>\n",
       "      <td>-1.841987</td>\n",
       "      <td>-0.846325</td>\n",
       "      <td>0.467033</td>\n",
       "      <td>-2.007557</td>\n",
       "      <td>-0.838151</td>\n",
       "      <td>-0.564499</td>\n",
       "      <td>-0.797622</td>\n",
       "      <td>-0.150012</td>\n",
       "      <td>0.597535</td>\n",
       "      <td>...</td>\n",
       "      <td>0.576627</td>\n",
       "      <td>-1.532795</td>\n",
       "      <td>-0.671919</td>\n",
       "      <td>-0.533816</td>\n",
       "      <td>-1.642514</td>\n",
       "      <td>-0.605328</td>\n",
       "      <td>0.617045</td>\n",
       "      <td>-1.796660</td>\n",
       "      <td>-0.818863</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-0.378445</td>\n",
       "      <td>-1.821358</td>\n",
       "      <td>-0.839571</td>\n",
       "      <td>0.471135</td>\n",
       "      <td>-2.010042</td>\n",
       "      <td>-0.832021</td>\n",
       "      <td>-0.563753</td>\n",
       "      <td>-0.795704</td>\n",
       "      <td>-0.151608</td>\n",
       "      <td>0.597007</td>\n",
       "      <td>...</td>\n",
       "      <td>0.576456</td>\n",
       "      <td>-1.532478</td>\n",
       "      <td>-0.671555</td>\n",
       "      <td>-0.526319</td>\n",
       "      <td>-1.697145</td>\n",
       "      <td>-0.624302</td>\n",
       "      <td>0.624789</td>\n",
       "      <td>-1.738568</td>\n",
       "      <td>-0.788060</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-0.386751</td>\n",
       "      <td>-1.845643</td>\n",
       "      <td>-0.848031</td>\n",
       "      <td>0.506153</td>\n",
       "      <td>-2.032552</td>\n",
       "      <td>-0.841696</td>\n",
       "      <td>-0.565008</td>\n",
       "      <td>-0.790238</td>\n",
       "      <td>-0.152350</td>\n",
       "      <td>0.599099</td>\n",
       "      <td>...</td>\n",
       "      <td>0.579362</td>\n",
       "      <td>-1.535441</td>\n",
       "      <td>-0.672198</td>\n",
       "      <td>-0.554538</td>\n",
       "      <td>-1.644413</td>\n",
       "      <td>-0.602884</td>\n",
       "      <td>0.634100</td>\n",
       "      <td>-1.749744</td>\n",
       "      <td>-0.816695</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-0.417101</td>\n",
       "      <td>-1.941721</td>\n",
       "      <td>-0.885500</td>\n",
       "      <td>0.611207</td>\n",
       "      <td>-1.953282</td>\n",
       "      <td>-0.902529</td>\n",
       "      <td>-0.573550</td>\n",
       "      <td>-0.799730</td>\n",
       "      <td>-0.169575</td>\n",
       "      <td>0.606181</td>\n",
       "      <td>...</td>\n",
       "      <td>0.626759</td>\n",
       "      <td>-1.482552</td>\n",
       "      <td>-0.659393</td>\n",
       "      <td>-0.576196</td>\n",
       "      <td>-1.763092</td>\n",
       "      <td>-0.694843</td>\n",
       "      <td>0.680086</td>\n",
       "      <td>-1.664565</td>\n",
       "      <td>-0.857897</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18355</th>\n",
       "      <td>-0.845492</td>\n",
       "      <td>-1.919878</td>\n",
       "      <td>-0.583276</td>\n",
       "      <td>0.856647</td>\n",
       "      <td>-1.978063</td>\n",
       "      <td>-0.553987</td>\n",
       "      <td>-0.790264</td>\n",
       "      <td>-0.770808</td>\n",
       "      <td>-0.075527</td>\n",
       "      <td>0.673925</td>\n",
       "      <td>...</td>\n",
       "      <td>0.857950</td>\n",
       "      <td>-1.527194</td>\n",
       "      <td>-0.315056</td>\n",
       "      <td>-0.889773</td>\n",
       "      <td>-1.684754</td>\n",
       "      <td>-0.651485</td>\n",
       "      <td>0.870652</td>\n",
       "      <td>-1.659452</td>\n",
       "      <td>-0.607189</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18356</th>\n",
       "      <td>-0.761116</td>\n",
       "      <td>-1.945017</td>\n",
       "      <td>-0.587023</td>\n",
       "      <td>0.680567</td>\n",
       "      <td>-1.992559</td>\n",
       "      <td>-0.566642</td>\n",
       "      <td>-0.759338</td>\n",
       "      <td>-0.790078</td>\n",
       "      <td>-0.090382</td>\n",
       "      <td>0.630602</td>\n",
       "      <td>...</td>\n",
       "      <td>0.737224</td>\n",
       "      <td>-1.501386</td>\n",
       "      <td>-0.315699</td>\n",
       "      <td>-0.642052</td>\n",
       "      <td>-1.659315</td>\n",
       "      <td>-0.660619</td>\n",
       "      <td>0.754220</td>\n",
       "      <td>-1.727294</td>\n",
       "      <td>-0.618963</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18357</th>\n",
       "      <td>-0.679080</td>\n",
       "      <td>-1.933950</td>\n",
       "      <td>-0.615705</td>\n",
       "      <td>0.574144</td>\n",
       "      <td>-1.986102</td>\n",
       "      <td>-0.572386</td>\n",
       "      <td>-0.741427</td>\n",
       "      <td>-0.793610</td>\n",
       "      <td>-0.100764</td>\n",
       "      <td>0.607822</td>\n",
       "      <td>...</td>\n",
       "      <td>0.659843</td>\n",
       "      <td>-1.503965</td>\n",
       "      <td>-0.324704</td>\n",
       "      <td>-0.609636</td>\n",
       "      <td>-1.705025</td>\n",
       "      <td>-0.690759</td>\n",
       "      <td>0.568415</td>\n",
       "      <td>-1.877402</td>\n",
       "      <td>-0.412571</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18358</th>\n",
       "      <td>-0.670308</td>\n",
       "      <td>-1.916436</td>\n",
       "      <td>-0.634439</td>\n",
       "      <td>0.478221</td>\n",
       "      <td>-2.078024</td>\n",
       "      <td>-0.620835</td>\n",
       "      <td>-0.731334</td>\n",
       "      <td>-0.790556</td>\n",
       "      <td>-0.109856</td>\n",
       "      <td>0.600801</td>\n",
       "      <td>...</td>\n",
       "      <td>0.597387</td>\n",
       "      <td>-1.612530</td>\n",
       "      <td>-0.412526</td>\n",
       "      <td>-0.560203</td>\n",
       "      <td>-1.678066</td>\n",
       "      <td>-0.716252</td>\n",
       "      <td>0.550804</td>\n",
       "      <td>-1.903281</td>\n",
       "      <td>-0.472645</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18359</th>\n",
       "      <td>-0.651644</td>\n",
       "      <td>-1.911442</td>\n",
       "      <td>-0.656298</td>\n",
       "      <td>0.469341</td>\n",
       "      <td>-2.086228</td>\n",
       "      <td>-0.644960</td>\n",
       "      <td>-0.725837</td>\n",
       "      <td>-0.787746</td>\n",
       "      <td>-0.116215</td>\n",
       "      <td>0.597154</td>\n",
       "      <td>...</td>\n",
       "      <td>0.591917</td>\n",
       "      <td>-1.623406</td>\n",
       "      <td>-0.413167</td>\n",
       "      <td>-0.557817</td>\n",
       "      <td>-1.641795</td>\n",
       "      <td>-0.704824</td>\n",
       "      <td>0.562437</td>\n",
       "      <td>-1.895895</td>\n",
       "      <td>-0.454302</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>18360 rows × 25 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "              0         1         2         3         4         5         6  \\\n",
       "0     -0.372758 -1.821679 -0.846321  0.465208 -2.015072 -0.839242 -0.564097   \n",
       "1     -0.367844 -1.841987 -0.846325  0.467033 -2.007557 -0.838151 -0.564499   \n",
       "2     -0.378445 -1.821358 -0.839571  0.471135 -2.010042 -0.832021 -0.563753   \n",
       "3     -0.386751 -1.845643 -0.848031  0.506153 -2.032552 -0.841696 -0.565008   \n",
       "4     -0.417101 -1.941721 -0.885500  0.611207 -1.953282 -0.902529 -0.573550   \n",
       "...         ...       ...       ...       ...       ...       ...       ...   \n",
       "18355 -0.845492 -1.919878 -0.583276  0.856647 -1.978063 -0.553987 -0.790264   \n",
       "18356 -0.761116 -1.945017 -0.587023  0.680567 -1.992559 -0.566642 -0.759338   \n",
       "18357 -0.679080 -1.933950 -0.615705  0.574144 -1.986102 -0.572386 -0.741427   \n",
       "18358 -0.670308 -1.916436 -0.634439  0.478221 -2.078024 -0.620835 -0.731334   \n",
       "18359 -0.651644 -1.911442 -0.656298  0.469341 -2.086228 -0.644960 -0.725837   \n",
       "\n",
       "              7         8         9  ...        15        16        17  \\\n",
       "0     -0.796225 -0.149604  0.599967  ...  0.577993 -1.534954 -0.673190   \n",
       "1     -0.797622 -0.150012  0.597535  ...  0.576627 -1.532795 -0.671919   \n",
       "2     -0.795704 -0.151608  0.597007  ...  0.576456 -1.532478 -0.671555   \n",
       "3     -0.790238 -0.152350  0.599099  ...  0.579362 -1.535441 -0.672198   \n",
       "4     -0.799730 -0.169575  0.606181  ...  0.626759 -1.482552 -0.659393   \n",
       "...         ...       ...       ...  ...       ...       ...       ...   \n",
       "18355 -0.770808 -0.075527  0.673925  ...  0.857950 -1.527194 -0.315056   \n",
       "18356 -0.790078 -0.090382  0.630602  ...  0.737224 -1.501386 -0.315699   \n",
       "18357 -0.793610 -0.100764  0.607822  ...  0.659843 -1.503965 -0.324704   \n",
       "18358 -0.790556 -0.109856  0.600801  ...  0.597387 -1.612530 -0.412526   \n",
       "18359 -0.787746 -0.116215  0.597154  ...  0.591917 -1.623406 -0.413167   \n",
       "\n",
       "             18        19        20        21        22        23  target  \n",
       "0     -0.536343 -1.626957 -0.594337  0.619205 -1.771773 -0.810086     4.0  \n",
       "1     -0.533816 -1.642514 -0.605328  0.617045 -1.796660 -0.818863     4.0  \n",
       "2     -0.526319 -1.697145 -0.624302  0.624789 -1.738568 -0.788060     4.0  \n",
       "3     -0.554538 -1.644413 -0.602884  0.634100 -1.749744 -0.816695     4.0  \n",
       "4     -0.576196 -1.763092 -0.694843  0.680086 -1.664565 -0.857897     4.0  \n",
       "...         ...       ...       ...       ...       ...       ...     ...  \n",
       "18355 -0.889773 -1.684754 -0.651485  0.870652 -1.659452 -0.607189     4.0  \n",
       "18356 -0.642052 -1.659315 -0.660619  0.754220 -1.727294 -0.618963     4.0  \n",
       "18357 -0.609636 -1.705025 -0.690759  0.568415 -1.877402 -0.412571     4.0  \n",
       "18358 -0.560203 -1.678066 -0.716252  0.550804 -1.903281 -0.472645     4.0  \n",
       "18359 -0.557817 -1.641795 -0.704824  0.562437 -1.895895 -0.454302     4.0  \n",
       "\n",
       "[18360 rows x 25 columns]"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ds_name = 'NATOPS' \n",
    "X, y, splits = get_UCR_data(ds_name, return_split=False)\n",
    "data = X.transpose(1,0,2).reshape(X.shape[1], -1)\n",
    "print(X.shape, data.shape)\n",
    "df = pd.DataFrame(data).T\n",
    "df2 = pd.DataFrame(np.repeat(y, X.shape[2]), columns=['target'])\n",
    "df = df.merge(df2, left_index=True, right_index=True)\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In this case, you'll need to set the following parameters:\n",
    " \n",
    "* window_length\n",
    "* stride\n",
    "* start\n",
    "* horizon\n",
    "* get_x\n",
    "* get_y\n",
    "* seq_first\n",
    "\n",
    "You also need to bear in mind that you sould set shuffle=False when using splits since the individual time series are correlated with rest."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1152x36 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "(#360) [(TSTensor(vars:24, len:51, device=cpu), TensorCategory(3)), (TSTensor(vars:24, len:51, device=cpu), TensorCategory(2)), (TSTensor(vars:24, len:51, device=cpu), TensorCategory(2)), (TSTensor(vars:24, len:51, device=cpu), TensorCategory(3)), (TSTensor(vars:24, len:51, device=cpu), TensorCategory(2)), (TSTensor(vars:24, len:51, device=cpu), TensorCategory(4)), (TSTensor(vars:24, len:51, device=cpu), TensorCategory(0)), (TSTensor(vars:24, len:51, device=cpu), TensorCategory(5)), (TSTensor(vars:24, len:51, device=cpu), TensorCategory(2)), (TSTensor(vars:24, len:51, device=cpu), TensorCategory(1))] ...]"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "window_length = X.shape[-1]  # window_length is usually selected based on prior domain knowledge or by trial and error\n",
    "stride = None                # None for non-overlapping (stride = window_length) (default = 1). This depends on how often you want to predict once the model is trained\n",
    "start = 0                    # use all data since the first time stamp (default = 0)\n",
    "get_x = df.columns[:-1]      # Indicates which are the columns that contain the x data.\n",
    "get_y = 'target'             # In multivariate time series, you must indicate which is/are the y columns\n",
    "horizon = 0                  # 0 means y is taken from the last time stamp of the time sequence (default = 0)\n",
    "seq_first = True\n",
    "                            \n",
    "X, y = SlidingWindow(window_length, stride=stride, start=start, get_x=get_x,  get_y=get_y, horizon=horizon, seq_first=seq_first)(df)\n",
    "splits = get_splits(y, valid_size=.2, stratify=True, random_state=23, shuffle=False)\n",
    "tfms  = [None, [Categorize()]]\n",
    "dsets = TSDatasets(X, y, tfms=tfms, splits=splits)\n",
    "dsets"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "                <audio  controls=\"controls\" autoplay=\"autoplay\">\n",
       "                    <source src=\"data:audio/wav;base64,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\" type=\"audio/wav\" />\n",
       "                    Your browser does not support the audio element.\n",
       "                </audio>\n",
       "              "
      ],
      "text/plain": [
       "<IPython.lib.display.Audio object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "beep()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
